1 Bacterial taxonomy stats

PSB
## phyloseq-class experiment-level object
## otu_table()   OTU Table:         [ 342 taxa and 61 samples ]
## sample_data() Sample Data:       [ 61 samples by 21 sample variables ]
## tax_table()   Taxonomy Table:    [ 342 taxa by 7 taxonomic ranks ]
total_reads <- sum(sample_sums(PSB))

2 Viral taxonomy stats

total_reads <- sum(sample_sums(PSV))

#Realm-level
# no_realm <- subset_taxa(PSV,Realm=="Unclassified")
# 1-sum(sample_sums(no_realm))/total_reads

#Class
# no_class <- subset_taxa(PSV,Class=="Unclassified")
# 1-sum(sample_sums(no_class))/total_reads

#Order
no_order <- subset_taxa(PSV,Order=="Unclassified")
1-sum(sample_sums(no_order))/total_reads
## [1] 0.0689926
#Family
no_family <- subset_taxa(PSV,Family=="Unclassified")
1-sum(sample_sums(no_family))/total_reads
## [1] 0.005573007
#Genus
no_genus <- subset_taxa(PSV,Genus=="Unclassified")
1-sum(sample_sums(no_genus))/total_reads
## [1] 0
#Species
no_species <- subset_taxa(PSV,Species=="Unclassified")
1-sum(sample_sums(no_species))/total_reads
## [1] 0
#Caudoviricetes
caudovirales <- subset_taxa(PSV,Class=="Caudoviricetes")
sum(sample_sums(caudovirales))/total_reads
## [1] 0.994427
caudovirales_uncl <- subset_taxa(caudovirales,Genus=="Unclassified")
sum(sample_sums(caudovirales_uncl))/sum(sample_sums(caudovirales))
## [1] 1
sum(sample_sums(caudovirales_uncl))/total_reads
## [1] 0.994427
#Classified caudovirales
(sum(sample_sums(caudovirales))-sum(sample_sums(caudovirales_uncl)))/total_reads
## [1] 0

3 Barplots

3.1 Family level

3.2 Bacterial genera plus viral host predictions

4 Abundance heatmaps

4.1 Bacteria

4.1.1 Genus

4.1.2 Species

4.2 Virome

4.2.1 Genus

4.2.2 Species

PSVamp <- ampvis2::amp_load(PSV.no.realm)  
## Phyloseq object provided. Ignoring anything provided for the metadata, taxonomy, fasta, or tree arguments, using those from the phyloseq object instead.
## Warning: Could not find a column named OTU/ASV in otutable, using rownames as
## OTU ID's
## Warning: Could not find a column named OTU/ASV in taxonomy, using rownames as
## OTU ID's
PSVamp$tax[PSVamp$tax == "Unclassified"] <- ""
#rownames(PSVamp$tax) <- gsub("OTU", "vOTU", rownames(PSVamp$tax))

##Virome

amp_vir_species <- amp_heatmap(PSVamp,
            group_by = "Twin_pairs_unique",
            facet_by = "Days",
            plot_values = FALSE,
            tax_show = 30,
            tax_aggregate = "Genus" ,
            tax_add = NULL,
            tax_empty = "best",
            normalise = TRUE,
            color_vector = c("white", "red"),
            plot_colorscale = "sqrt",
            plot_legendbreaks = c(1, 10, 25, 50)
) +
  theme_classic() +
  theme(strip.background = element_rect(colour = "black", fill = "white"),
        strip.text.x = element_text(face = "bold"),
        axis.text.x=element_text(angle = -45, hjust = 0,vjust = 0.2),
        axis.text.y=element_text(face="italic")) +
  scale_y_discrete(labels=function(labels) str_replace_all(labels, c("OTU_" = "unlassified_", "o__" = "", "c__" = "")))



amp_vir_species

4.3 Host virome

5 Upset plot

5.1 Bacteria

5.2 Virome

5.3 Virome host

6 Alpha diversity

##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = Shannon ~ variable, data = rich)
## 
## $variable
##              diff         lwr       upr     p adj
## 15-1  -0.05465400 -0.88409084 0.7747828 0.9980934
## 30-1   0.04368086 -0.79632248 0.8836842 0.9990587
## 90-1   0.55128566 -0.29487163 1.3974430 0.3208382
## 30-15  0.09833487 -0.48059748 0.6772672 0.9694574
## 90-15  0.60593967  0.01811383 1.1937655 0.0409439
## 90-30  0.50760480 -0.09503884 1.1102484 0.1276992

##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = Shannon ~ variable, data = rich)
## 
## $variable
##              diff        lwr       upr     p adj
## 15-1  -0.28313685 -0.8951040 0.3288303 0.6133665
## 30-1  -0.01146464 -0.6422659 0.6193367 0.9999594
## 90-1  -0.39036878 -1.0594346 0.2786970 0.4177807
## 30-15  0.27167221 -0.3402949 0.8836394 0.6443038
## 90-15 -0.10723193 -0.7585710 0.5441071 0.9719606
## 90-30 -0.37890414 -1.0479699 0.2901617 0.4442411

6.1 Bacterial and viral shannon diversity

7 Beta diversity

7.1 Days

8 Within vs between twin pairs bray curtis dissimilarity

8.1 Individual time points

8.1.1 Day 1

8.1.2 Day 15

8.1.3 Day 30

8.1.4 Day 90

9 Effect size

9.1 Bacteria

## [1] 137

9.1.1 Db anova - constrained by time point

9.2 Virome

## [1] 576

9.2.1 Db anova - constrained for time point

9.3 Host virome

## [1] 305

9.3.1 Db anova - constrained for time point

9.4 Host virome - Genus

## [1] 305
##  [1] "Twin_pairs"                         "Days"                              
##  [3] "Gestational_age"                    "Birth_weight"                      
##  [5] "Small_for_gestational_age"          "Antenatal_steroids"                
##  [7] "Delivery_mode"                      "Intrapartum_antibiotic_prophylaxis"
##  [9] "Late_onset_sepsis"                  "Necrotizing_enterocolitis"         
## [11] "Patent_ductus_arteriosus"           "Bronchopulmonary_dysplasia"        
## [13] "Antibiotics_at_birth"               "Total_days_antibiotics_therapy"

9.4.1 Db anova - constrained for time point

9.5 Combined effect size plots

9.5.1 With viral hosts

9.5.2 Bacteria vs vira only

10 Rabuplot

10.1 Time

#remotes::install_github("jstokholm/rabuplot")
library(rabuplot)

PSV.host@sam_data$Days <- factor(PSV.host@sam_data$Days, levels = c("90","60","30","15","1"))
PSB@sam_data$Days <- factor(PSB@sam_data$Days, levels = c("90","60","30","15","1"))

rabu.vir <- rabuplot(
  PSV.host,
  violin = TRUE,
  predictor = "Days",
  p_adjust = TRUE,
  N_taxa = 10,
  colors = col_fil[1:4],
  italic_names = FALSE) +
  ggtitle("Viral hosts")

labels <- levels(factor(rabu.vir$data$variable))
labels[labels != "Other genus"] <- paste0("*", labels[labels != "Other genus"], "*")

rabu.vir <- rabu.vir + scale_x_discrete(labels = labels) + theme(axis.text.y = ggtext::element_markdown())

rabu.bac <- rabuplot(
  PSB,
  violin = TRUE,
  predictor = "Days",
  p_adjust = TRUE,
  N_taxa = 10,
  colors = col_fil[1:4],
  italic_names = FALSE) +
  #theme(legend.position = "none") +
  ggtitle("Bacteria")

labels <- levels(factor(rabu.bac$data$variable))
labels[labels != "Other genus"] <- paste0("*", labels[labels != "Other genus"], "*")

rabu.bac <- rabu.bac + scale_x_discrete(labels = labels) + theme(axis.text.y = ggtext::element_markdown())

ggarrange(rabu.bac,rabu.vir, common.legend = TRUE, legend = "bottom")

10.2 Bronchopulmonary_dysplasia

#remotes::install_github("jstokholm/rabuplot")
library(rabuplot)

rabu.vir.bpd <- rabuplot(
  PSV.host,
  violin = TRUE,
  predictor = "Bronchopulmonary_dysplasia",
  legend_title = "Bronchopulmonary dysplasia",
  p_adjust = TRUE,
  #p_stars = TRUE,
  N_taxa = 10,
  colors = col_fil[1:2],
  italic_names = FALSE) +
  ggtitle("Viral hosts") +
  scale_x_discrete(limits = rev)

labels <- levels(factor(rabu.vir.bpd$data$variable))
labels[labels != "Other genus"] <- paste0("*", labels[labels != "Other genus"], "*")

rabu.vir.bpd <- rabu.vir.bpd + scale_x_discrete(labels = labels) + theme(axis.text.y = ggtext::element_markdown())


rabu.bac.bpd <- rabuplot(
  PSB,
  violin = TRUE,
  predictor = "Bronchopulmonary_dysplasia",
  legend_title = "Bronchopulmonary dysplasia",
  p_adjust = TRUE,
  #p_stars = TRUE,
  N_taxa = 10,
  colors = col_fil[1:2],
  italic_names = FALSE) +
  #theme(legend.position = "none") +
  ggtitle("Bacteria") +
  scale_x_discrete(limits = rev)

labels <- levels(factor(rabu.bac.bpd$data$variable))
labels[labels != "Other genus"] <- paste0("*", labels[labels != "Other genus"], "*")

rabu.bac.bpd <- rabu.bac.bpd + scale_x_discrete(labels = labels) + theme(axis.text.y = ggtext::element_markdown())
  

ggarrange(rabu.bac.bpd,rabu.vir.bpd, common.legend = TRUE, legend = "bottom")

10.3 Intrapartum antibiotics

#remotes::install_github("jstokholm/rabuplot")
library(rabuplot)

rabu.vir.tdab <- rabuplot(
  PSV.host,
  violin = TRUE,
  predictor = "Intrapartum_antibiotic_prophylaxis",
  legend_title = "Intrapartum antibiotic prophylaxis",
  p_adjust = TRUE,
  N_taxa = 10,
  colors = col_fil[1:3],
  italic_names = FALSE) +
  #theme(legend.position = "none") +
  ggplot2::ggtitle("Viral hosts") +
  scale_x_discrete(limits = rev)

labels <- levels(factor(rabu.vir.tdab$data$variable))
labels[labels != "Other genus"] <- paste0("*", labels[labels != "Other genus"], "*")

rabu.vir.tdab <- rabu.vir.tdab + scale_x_discrete(labels = labels) + theme(axis.text.y = ggtext::element_markdown())

rabu.bac.tdab <- rabuplot(
  PSB,
  violin = TRUE,
  predictor = "Intrapartum_antibiotic_prophylaxis",
  legend_title = "Intrapartum antibiotic prophylaxis",
  p_adjust = TRUE,
  N_taxa = 10,
  colors = col_fil[1:3],
  italic_names = FALSE) +
  #theme(legend.position = "none") +
  ggtitle("Bacteria") +
  scale_x_discrete(limits = rev)

labels <- levels(factor(rabu.bac.tdab$data$variable))
labels[labels != "Other genus"] <- paste0("*", labels[labels != "Other genus"], "*")

rabu.bac.tdab <- rabu.bac.tdab + scale_x_discrete(labels = labels) + theme(axis.text.y = ggtext::element_markdown())

ggarrange(rabu.bac.tdab,rabu.vir.tdab, common.legend = TRUE, legend = "bottom")

10.4 Total days antibiotics treatment

#remotes::install_github("jstokholm/rabuplot")
library(rabuplot)

rabu.vir.iap <- rabuplot(
  PSV.host,
  violin = TRUE, predictor = "Total_days_antibiotics_therapy", p_adjust = TRUE, N_taxa = 10, colors = col_fil[1:3]) +
  ggtitle("Viral hosts") +
  scale_x_discrete(limits = rev)

rabu.bac.iap <- rabuplot(
  PSB,
  violin = TRUE, predictor = "Total_days_antibiotics_therapy", p_adjust = TRUE, N_taxa = 10, colors = col_fil[1:3]) +
  #theme(legend.position = "none") +
  ggtitle("Bacteria") +
  scale_x_discrete(limits = rev)

ggarrange(rabu.bac.iap,rabu.vir.iap, common.legend = TRUE, legend = "bottom")

10.5 Antibiotics at birth

#remotes::install_github("jstokholm/rabuplot")
library(rabuplot)

rabu.vir.tdab <- rabuplot(
  PSV.host,
  violin = TRUE, predictor = "Antibiotics_at_birth", p_adjust = TRUE, N_taxa = 10, colors = col_fil[1:3]) +
  ggtitle("Viral hosts") +
  scale_x_discrete(limits = rev)

rabu.bac.tdab <- rabuplot(
  PSB,
  violin = TRUE, predictor = "Antibiotics_at_birth", p_adjust = TRUE, N_taxa = 10, colors = col_fil[1:3]) +
  #theme(legend.position = "none") +
  ggtitle("Bacteria") +
  scale_x_discrete(limits = rev)

ggarrange(rabu.bac.tdab,rabu.vir.tdab, common.legend = TRUE, legend = "bottom")

10.6 Small for gestational age

#remotes::install_github("jstokholm/rabuplot")
library(rabuplot)

rabu.vir.sga <- rabuplot(
  PSV.host,
  violin = TRUE,
  predictor = "Small_for_gestational_age",
  legend_title = "Small for gestational age",
  p_adjust = TRUE,
  #p_stars = TRUE,
  N_taxa = 10,
  colors = col_fil[3:4],
  italic_names = FALSE) +
  ggtitle("Viral hosts") +
  scale_x_discrete(limits = rev)

labels <- levels(factor(rabu.vir.sga$data$variable))
labels[labels != "Other genus"] <- paste0("*", labels[labels != "Other genus"], "*")

rabu.vir.sga <- rabu.vir.sga + scale_x_discrete(labels = labels) + theme(axis.text.y = ggtext::element_markdown())

rabu.bac.sga <- rabuplot(
  PSB,
  violin = TRUE,
  predictor = "Small_for_gestational_age",
  legend_title = "Small for gestational age",
  p_adjust = TRUE,
  #p_stars = TRUE,
  N_taxa = 10,
  colors = col_fil[3:4],
  italic_names = FALSE) +
  ggtitle("Bacteria") +
  scale_x_discrete(limits = rev)

labels <- levels(factor(rabu.bac.sga$data$variable))
labels[labels != "Other genus"] <- paste0("*", labels[labels != "Other genus"], "*")

rabu.bac.sga <- rabu.bac.sga + scale_x_discrete(labels = labels) + theme(axis.text.y = ggtext::element_markdown())

ggarrange(rabu.bac.sga,rabu.vir.sga, common.legend = TRUE, legend = "bottom")

11 RCCA - trans kingdom interactions

11.1 Conversion and screeplot

#Subset samples present in both
vir_ids <- PSV@sam_data$description %>% str_split_i("_",-1)
PSV@sam_data$id <- vir_ids

PSB.CSS.both <- subset_samples(PSB,description %in% vir_ids)
#PSV.CSS.both <- subset_samples(PSV.CSS,vir_ids %in% PSB.CSS.both@sam_data$description)
PSV.CSS.host.both <- subset_samples(PSV.CSS.host,vir_ids %in% PSB.CSS.both@sam_data$description)

##Transpose and convert to dataframes
botu <- data.frame(PSB.CSS.both@otu_table)
#Select last non-empty taxonomic rank
tax.bac <- as.data.frame(PSB.CSS.both@tax_table) %>% dplyr::mutate_all(~na_if(., '')) %>% apply(.,1, function(x) tail(stats::na.omit(x), 1))
rownames(botu) <- paste(rownames(botu),tax.bac, sep = "-")

votu <- data.frame(PSV.CSS.host.both@otu_table)
#Select last non-empty taxonomic rank
tax.vir <- as.data.frame(PSV.CSS.host.both@tax_table) %>% dplyr::mutate_all(~na_if(., '')) %>% apply(.,1, function(x) tail(stats::na.omit(x), 1))
rownames(votu) <- paste(rownames(votu),tax.vir, sep = "-")


  ###########Convert to matrix and transpose - Maybe skip?
t(as.matrix.data.frame(botu))->tmbacteria
  #Save OTU Taxonomy from header
tmcolnames <- colnames(tmbacteria)
  #Remove first line
rownames(tmbacteria) <- NULL
  #Apply as.numeric to matrix(will remove header as it is in characters)
nbacteria <- mapply(tmbacteria, FUN=as.numeric)
  #Convert back into matrix and add colnames
mbacteria <- matrix(nbacteria, ncol=NCOL(tmbacteria), nrow=NROW(tmbacteria))
colnames(mbacteria) <- tmcolnames

  
    ##Repeat for viral OTU table
t(as.matrix.data.frame(votu))->tmvirome
tmcolnames <- colnames(tmvirome)
rownames(tmvirome) <- NULL
nvirome <- mapply(tmvirome, FUN=as.numeric)
mvirome <- matrix(nvirome, ncol=NCOL(tmvirome), nrow=NROW(tmvirome))
colnames(mvirome) <- tmcolnames
    ##Alternatively use: data.matrix(frame, rownames.force = NA)

    ##Converting and removing near-zero variance values
bac <- mbacteria[,-c(1)]
nzv <- nearZeroVar(bac)
bac <- bac[, -nzv$Position]
           
           
vir <- mvirome[,-c(1)]
#nzv <- nearZeroVar(vir) # If any
#vir <- vir[, -nzv$Position]


  #PCA
library(vegan)
mod_bac <- rda(bac, scale = TRUE)
plot(mod_bac, scaling = 3)

screeplot(mod_bac)

mod_vir <- rda(vir, scale = TRUE)
plot(mod_vir, scaling = 3)

screeplot(mod_vir)

scaling = "shrinkage"
  #Apply scaling 
result_1comp <- rcc(bac, vir, method = scaling, ncomp = 1)
result_2comp <- rcc(bac, vir, method = scaling, ncomp = 2)
result_3comp <- rcc(bac, vir, method = scaling, ncomp = 3)
result_4comp <- rcc(bac, vir, method = scaling, ncomp = 4)

ggarrange(plot(result_1comp, type = "barplot"),
          plot(result_2comp, type = "barplot"),
          plot(result_3comp, type = "barplot"),
          plot(result_4comp, type = "barplot")
          ,nrow = 2)
## $`1`

## 
## $`2`

## 
## attr(,"class")
## [1] "list"      "ggarrange"
# produce a heat map of the cross correlation matrix
imgCor(bac, vir, sideColors = c("purple", "green")) 

11.2 Model tuning

# set grid search values for each regularisation parameter
grid1 <- seq(0.001, 0.2, length = 20) 
grid2 <- seq(0.001, 0.2, length = 20)

# optimise the regularisation parameter values
sl(cv.tune.rcc, tune.rcc(bac, vir, grid1 = grid1, grid2 = grid2, 
                                   validation = "loo"),overwrite = F)

# examine the results of CV tuning
plot(cv.tune.rcc)

cv.tune.rcc
## 
## Call:
##  tune.rcc(X = bac, Y = vir, grid1 = grid1, grid2 = grid2, validation = "loo") 
## 
##   lambda1 =  0.2 , see object$opt.lambda1
##   lambda2 =  0.001 ,  see object$opt.lambda2
##  CV-score =  0.2734331 , see object$opt.score
#manually set lambda scores
#opt.l1 <- 1.7
#opt.l2 <- 0.003
opt.l1 <- cv.tune.rcc$opt.lambda1
opt.l2 <- cv.tune.rcc$opt.lambda2

11.3 Model and component selection

shrink.rcc <- rcc(bac, vir, method = "shrinkage")

CV.rcc <- rcc(bac, vir, method = "ridge", 
                         lambda1 = opt.l1,
                         lambda2 = opt.l2) 

# barplot of cross validation method rCCA canonical correlations
plot(CV.rcc, type = "barplot", main = "Cross Validation") 

# barplot of shrinkage method rCCA canonical correlations
plot(shrink.rcc, type = "barplot", main = "Shrinkage")

11.4 Run model

#Perfrom optimised CV rCCA

result.CV <- rcc(bac, vir, method = "ridge",
                         lambda1 = opt.l1,
                         lambda2 = opt.l2,
              ncomp=3)

result.raw <- rcc(bac, vir, method = "shrinkage",ncomp=3)

#Remove OTU IDs to only show taxonomy
result <- result.raw

result$names$colnames$X <- gsub(".*\\-", "", result$names$colnames$X) %>% make.unique(sep="_")
result$names$colnames$Y <- gsub(".*\\-", "", result$names$colnames$Y) %>% make.unique(sep="_")


# colnames(result$X) <- gsub(".*\\-", "", colnames(result$X))
# colnames(result$Y) <- gsub(".*\\-", "", colnames(result$Y))

# rownames(result$loadings$X) <- gsub(".*\\-", "", rownames(result$loadings$X))
# rownames(result$loadings$Y) <- gsub(".*\\-", "", rownames(result$loadings$Y))

11.5 Visualization

11.5.1 Heatmaps

#Defne pallette to only add colour to only high
##Generate new pallette
palette <- hcl.colors(200, palette = "Zissou 1", alpha = NULL, rev = FALSE, fixup = TRUE) #Seclect palette https://developer.r-project.org/Blog/public/2019/04/01/hcl-based-color-palettes-in-grdevices/
palette[61:140] <- "white" #Select which part of pallette to replace with white

# high4_2c <- cim(result, comp = 1:2, ylab = "Bacteria", xlab = "Virome", margins = c(12,18),cutoff = 0.4, color = palette)
# high45_2c <- cim(result, comp = 1:2, ylab = "Bacteria", xlab = "Virome", margins = c(12,18),cutoff = 0.45, color = palette)
#high5_3c <- cim(result, comp = 1:2, ylab = "Bacteria", xlab = "Virome", margins = c(12,18),cutoff = 0.5, color = palette)

#pdf(filename="high5_3c.pdf", res = 600, width = 4000, height = 4000)
#high5_3c
#dev.off()

######

high6_3c <- cim(result, comp = 1:3, ylab = "Bacteria", xlab = "Virome host prediction", margins = c(7,9),cutoff = 0.6, color = palette)

high5_3c <- cim(result, comp = 1:3, ylab = "Bacteria", xlab = "Virome host prediction", margins = c(7,9),cutoff = 0.5, color = palette)

high45_3c<- cim(result, comp = 1:3, ylab = "Bacteria", xlab = "Virome host prediction", margins = c(15,20),cutoff = 0.45, color = palette)

high4_3c <- cim(result, comp = 1:3, ylab = "Bacteria", xlab = "Virome host prediction", margins = c(15,20),cutoff = 0.4, color = palette)

#mat5 <- high5_2c$mat
mat6_3c <- high6_3c$mat
mat45_3c <- high45_3c$mat
mat4_3c <- high4_3c$mat
  
 #Output Matrix
write.table(mat45_3c, "Matrix_high_3-Component_0.45.txt", sep="\t")

#Make linear plots of all bac and vir 
bacmat6_3c <- bac[,rownames(mat6_3c)]
virmat6_3c <- vir[,colnames(mat6_3c)]
bacvirmat6_3c <- cbind(bacmat6_3c,virmat6_3c)
bac45_3c <- bac[,rownames(mat45_3c)]
vir45_3c <- vir[,colnames(mat45_3c)]
bacvirmat45_3c <- cbind(bac45_3c,vir45_3c)

#ggpairs
library(GGally)
#ggpairs(bacvir)
#ggpairs(bacvir45,columns=3:13)
#ggpairs(as.data.frame(bacvir45))
sl(pairs45,ggpairs(as.data.frame(bacvirmat45_3c)))
sl(pairs6,ggpairs(as.data.frame(bacvirmat6_3c)))

# pairs45 +
#   theme(axis.text.x = element_text(angle = -90, hjust = 0, vjust=0.5)) 

#pairs6 +
#   theme(axis.text.x = element_text(angle = -90, hjust = 0, vjust=0.5)) 

11.5.2 Network plots

11.5.2.1 Shrinkage

# Reformat for gephi

## Save blocks as polygon to determine shape in network

result$names$Polygon <- result$names$data
result$names$Polygon <- replace(result$names$data, c("bac","vir"),c(3,4)) %>% as.integer()

## Remove ubique markers to allow shared coloring in Gephi
result$names_simple$colnames$X <- gsub("*.\\_", "", result$names$colnames$X)
result$names_simple$colnames$Y <- gsub("*.\\_", "", result$names$colnames$Y)

#Show network

network(result, comp = 1:3, interactive = FALSE,
        lwd.edge = 2,
        cex.node.name = 14,
        cutoff = 0.3,
        color.node = col_fil[1:2]) 

network(result, comp = 1:3, interactive = FALSE,
        lwd.edge = 2,
        cutoff = 0.4,
        color.node = col_fil[1:2]) 

network(result, comp = 1:3, interactive = FALSE,
        lwd.edge = 2,
        cutoff = 0.5,
        color.node = col_fil[1:2]) 

#Export network result
network.res <- network(result, comp = 1:3, interactive = FALSE,
        lwd.edge = 2,
        cutoff = 0.30,
        color.node = col_fil[1:2])

library(igraph)

#network.res 

write.graph(network.res$gR, file = "network.shrinkage0.3.gml", format = "gml")

11.5.2.2 CV

result.CV$names_simple$colnames$X <- gsub("*.\\_", "", result.CV$names$colnames$X)
result.CV$names_simple$colnames$Y <- gsub("*.\\_", "", result.CV$names$colnames$Y)

#Show network
network(result.CV, comp = 1:3, interactive = FALSE,
        lwd.edge = 2,
        cutoff = 0.3,
        color.node = col_fil[1:2]) 

network(result.CV, comp = 1:3, interactive = FALSE,
        lwd.edge = 2,
        cutoff = 0.35,
        color.node = col_fil[1:2]) 

# network(result.CV, comp = 1:3, interactive = FALSE,
#         lwd.edge = 2,
#         cutoff = 0.5,
#         color.node = col_fil[1:2]) 


library(igraph)
network.res <- network(result, comp = 1:3, interactive = FALSE,
        lwd.edge = 2,
        cutoff = 0.30,
        color.node = col_fil[1:2])

write.graph(network.res$gR, file = "network.CV0.3.gml", format = "gml")

12 Figures - arrange and save

12.1 Figure 1

12.2 Figure S1

12.3 Figure 2

12.4 Figure S2

12.5 Figure S3

12.6 Figure 3

12.7 Figure S4

13 Session info

sessionInfo()
## R version 4.2.1 (2022-06-23 ucrt)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 19045)
## 
## Matrix products: default
## 
## locale:
## [1] LC_COLLATE=Danish_Denmark.utf8  LC_CTYPE=Danish_Denmark.utf8   
## [3] LC_MONETARY=Danish_Denmark.utf8 LC_NUMERIC=C                   
## [5] LC_TIME=Danish_Denmark.utf8    
## 
## attached base packages:
## [1] grid      stats4    stats     graphics  grDevices utils     datasets 
## [8] methods   base     
## 
## other attached packages:
##  [1] igraph_1.6.0                GGally_2.2.0               
##  [3] rabuplot_0.0.1.09           UpSetR_1.4.0               
##  [5] VennDiagram_1.7.3           futile.logger_1.4.3        
##  [7] reshape2_1.4.4              metagenomeSeq_1.38.0       
##  [9] RColorBrewer_1.1-3          glmnet_4.1-8               
## [11] Matrix_1.6-5                limma_3.52.4               
## [13] readxl_1.4.3                phyloseq_1.40.0            
## [15] mixOmics_6.20.0             MASS_7.3-60.0.1            
## [17] usdm_2.1-7                  terra_1.7-65               
## [19] directlabels_2024.1.21      vegan_2.6-4                
## [21] lattice_0.22-5              permute_0.9-7              
## [23] viridis_0.6.5               viridisLite_0.4.2          
## [25] DESeq2_1.36.0               SummarizedExperiment_1.26.1
## [27] Biobase_2.56.0              MatrixGenerics_1.8.1       
## [29] matrixStats_1.2.0           GenomicRanges_1.48.0       
## [31] GenomeInfoDb_1.32.4         IRanges_2.30.1             
## [33] S4Vectors_0.34.0            BiocGenerics_0.42.0        
## [35] data.table_1.14.10          RVAideMemoire_0.9-83-7     
## [37] cowplot_1.1.3               plyr_1.8.9                 
## [39] ampvis2_2.8.6               rstatix_0.7.2              
## [41] ggsci_3.0.0                 ggpubr_0.6.0               
## [43] lubridate_1.9.3             forcats_1.0.0              
## [45] stringr_1.5.1               dplyr_1.1.4                
## [47] purrr_1.0.2                 readr_2.1.5                
## [49] tidyr_1.3.1                 tibble_3.2.1               
## [51] ggplot2_3.5.1               tidyverse_2.0.0            
## 
## loaded via a namespace (and not attached):
##   [1] rappdirs_0.3.3          ragg_1.2.7              bit64_4.0.5            
##   [4] knitr_1.45              multcomp_1.4-25         DelayedArray_0.22.0    
##   [7] KEGGREST_1.36.3         MicrobiotaProcess_1.8.2 RCurl_1.98-1.14        
##  [10] generics_0.1.3          lambda.r_1.2.4          TH.data_1.1-2          
##  [13] usethis_2.2.2           RSQLite_2.3.5           commonmark_1.9.1       
##  [16] bit_4.0.5               tzdb_0.4.0              ggtreeExtra_1.6.1      
##  [19] xml2_1.3.6              httpuv_1.6.14           xfun_0.41              
##  [22] hms_1.1.3               jquerylib_0.1.4         evaluate_0.23          
##  [25] promises_1.2.1          DEoptimR_1.1-3          fansi_1.0.6            
##  [28] caTools_1.18.2          DBI_1.2.1               geneplotter_1.74.0     
##  [31] htmlwidgets_1.6.4       rARPACK_0.11-0          ellipsis_0.3.2         
##  [34] RSpectra_0.16-1         ggnewscale_0.4.9        backports_1.4.1        
##  [37] markdown_1.12           annotate_1.74.0         libcoin_1.0-10         
##  [40] vctrs_0.6.5             remotes_2.4.2.1         here_1.0.1             
##  [43] abind_1.4-5             httr2_1.0.0             cachem_1.0.8           
##  [46] withr_3.0.0             robustbase_0.99-2       treeio_1.20.2          
##  [49] getopt_1.20.4           cluster_2.1.6           ape_5.7-1              
##  [52] lazyeval_0.2.2          crayon_1.5.2            ellipse_0.5.0          
##  [55] genefilter_1.78.0       pkgconfig_2.0.3         labeling_0.4.3         
##  [58] nlme_3.1-164            pkgload_1.3.4           gitcreds_0.1.2         
##  [61] devtools_2.4.5          rlang_1.1.3             lifecycle_1.0.4        
##  [64] miniUI_0.1.1.1          sandwich_3.1-0          cellranger_1.1.0       
##  [67] rprojroot_2.0.4         aplot_0.2.2             raster_3.6-26          
##  [70] lpsymphony_1.24.0       carData_3.0-5           boot_1.3-28.1          
##  [73] Rhdf5lib_1.18.2         zoo_1.8-12              png_0.1-8              
##  [76] bitops_1.0-7            KernSmooth_2.23-22      rhdf5filters_1.8.0     
##  [79] Biostrings_2.64.1       blob_1.2.4              shape_1.4.6            
##  [82] coin_1.4-3              gridGraphics_0.5-1      ggsignif_0.6.4         
##  [85] scales_1.3.0            memoise_2.0.1           magrittr_2.0.3         
##  [88] gplots_3.1.3            zlibbioc_1.42.0         compiler_4.2.1         
##  [91] lme4_1.1-35.3           ggstar_1.0.4            cli_3.6.2              
##  [94] ade4_1.7-22             XVector_0.36.0          urlchecker_1.0.1       
##  [97] lmerTest_3.1-3          patchwork_1.2.0         formatR_1.14           
## [100] mgcv_1.9-1              tidyselect_1.2.1        stringi_1.8.4          
## [103] textshaping_0.3.7       highr_0.10              yaml_2.3.8             
## [106] locfit_1.5-9.8          ggrepel_0.9.5           sass_0.4.8             
## [109] ggstats_0.5.1           tools_4.2.1             timechange_0.3.0       
## [112] parallel_4.2.1          rstudioapi_0.15.0       foreach_1.5.2          
## [115] optparse_1.7.4          gridExtra_2.3           farver_2.1.2           
## [118] digest_0.6.35           shiny_1.8.0             ggtext_0.1.2           
## [121] quadprog_1.5-8          Rcpp_1.0.12             gridtext_0.1.5         
## [124] car_3.1-2               broom_1.0.5             later_1.3.2            
## [127] httr_1.4.7              AnnotationDbi_1.58.0    Wrench_1.14.0          
## [130] colorspace_2.1-0        XML_3.99-0.16.1         fs_1.6.4               
## [133] splines_4.2.1           yulab.utils_0.1.4       tidytree_0.4.6         
## [136] gh_1.4.0                sp_2.1-3                multtest_2.52.0        
## [139] ggplotify_0.1.2         systemfonts_1.0.5       plotly_4.10.4          
## [142] sessioninfo_1.2.2       xtable_1.8-4            nloptr_2.0.3           
## [145] futile.options_1.0.1    jsonlite_1.8.8          ggtree_3.4.4           
## [148] corpcor_1.6.10          modeltools_0.2-23       ggfun_0.1.4            
## [151] R6_2.5.1                profvis_0.3.8           metagMisc_0.0.4        
## [154] pillar_1.9.0            htmltools_0.5.7         mime_0.12              
## [157] minqa_1.2.7             Maaslin2_1.10.0         glue_1.7.0             
## [160] fastmap_1.1.1           BiocParallel_1.30.4     codetools_0.2-19       
## [163] pcaPP_2.0-4             pkgbuild_1.4.4          mvtnorm_1.2-4          
## [166] utf8_1.2.4              bslib_0.6.1             numDeriv_2016.8-1.1    
## [169] curl_5.2.0              gtools_3.9.5            biglm_0.9-2.1          
## [172] survival_3.5-7          rmarkdown_2.25          biomformat_1.24.0      
## [175] munsell_0.5.1           rhdf5_2.40.0            GenomeInfoDbData_1.2.8 
## [178] iterators_1.0.14        gtable_0.3.5
LS0tDQp0aXRsZTogIkl0YWxpYW4gcHJldGVybXMgMTZTIGFuZCB2aXJvbWUgYW5hbHlzaXMiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIG51bWJlcl9zZWN0aW9uczogVFJVRQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCmBgYHtyLCBpbmNsdWRlPUZ9DQpzdWJkaXJfbmFtZSA8LSAiSXRhbGlhbiBwcmV0ZXJtcyAxNlMgYW5kIHZpcm9tZSBhbmFseXNpcyINCg0KI1NldCB3b3JraW5nIGRpcmVjdG9yeSB0byBzY3JpcHQgZGlyZWN0b3J5DQojc2V0d2QoZGlybmFtZShyc3R1ZGlvYXBpOjpnZXRBY3RpdmVEb2N1bWVudENvbnRleHQoKSRwYXRoKSkNCg0KI0xvYWQgYW5kIHByZXBhcmUgT1RVLXRhYmxlcyArIGNvbG9yIHNjYWxlIGV0Yy4NCnNvdXJjZSgiQW5hbHlzaXMwX2ZpbGVfbG9hZGluZ19hbmRfcHJlcC5SIikNCg0KZGlyLmNyZWF0ZSgicmVzdWx0cyIsIHNob3dXYXJuaW5ncyA9IEZBTFNFLCByZWN1cnNpdmUgPSBUUlVFKQ0KDQp0aGVtZV9zZXQodGhlbWVfY2xhc3NpYyhiYXNlX2ZhbWlseSA9ICJzYW5zIikpICNzYW5zID0gVFQgQXJpYWwsIG1vbm8gPSBUVCBjb3VyaWVyIG5ldywgc2VyaWYgPSBUVCBUaW1lcyBuZXcgcm9tYW4gIA0KDQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTgsIGZpZy5mdWxsd2lkdGggPSBUUlVFKQ0KDQpgYGANCg0KIyBCYWN0ZXJpYWwgdGF4b25vbXkgc3RhdHMNCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVH0NClBTQg0KDQp0b3RhbF9yZWFkcyA8LSBzdW0oc2FtcGxlX3N1bXMoUFNCKSkNCmBgYA0KDQojIFZpcmFsIHRheG9ub215IHN0YXRzDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFR9DQp0b3RhbF9yZWFkcyA8LSBzdW0oc2FtcGxlX3N1bXMoUFNWKSkNCg0KI1JlYWxtLWxldmVsDQojIG5vX3JlYWxtIDwtIHN1YnNldF90YXhhKFBTVixSZWFsbT09IlVuY2xhc3NpZmllZCIpDQojIDEtc3VtKHNhbXBsZV9zdW1zKG5vX3JlYWxtKSkvdG90YWxfcmVhZHMNCg0KI0NsYXNzDQojIG5vX2NsYXNzIDwtIHN1YnNldF90YXhhKFBTVixDbGFzcz09IlVuY2xhc3NpZmllZCIpDQojIDEtc3VtKHNhbXBsZV9zdW1zKG5vX2NsYXNzKSkvdG90YWxfcmVhZHMNCg0KI09yZGVyDQpub19vcmRlciA8LSBzdWJzZXRfdGF4YShQU1YsT3JkZXI9PSJVbmNsYXNzaWZpZWQiKQ0KMS1zdW0oc2FtcGxlX3N1bXMobm9fb3JkZXIpKS90b3RhbF9yZWFkcw0KDQojRmFtaWx5DQpub19mYW1pbHkgPC0gc3Vic2V0X3RheGEoUFNWLEZhbWlseT09IlVuY2xhc3NpZmllZCIpDQoxLXN1bShzYW1wbGVfc3Vtcyhub19mYW1pbHkpKS90b3RhbF9yZWFkcw0KDQojR2VudXMNCm5vX2dlbnVzIDwtIHN1YnNldF90YXhhKFBTVixHZW51cz09IlVuY2xhc3NpZmllZCIpDQoxLXN1bShzYW1wbGVfc3Vtcyhub19nZW51cykpL3RvdGFsX3JlYWRzDQoNCiNTcGVjaWVzDQpub19zcGVjaWVzIDwtIHN1YnNldF90YXhhKFBTVixTcGVjaWVzPT0iVW5jbGFzc2lmaWVkIikNCjEtc3VtKHNhbXBsZV9zdW1zKG5vX3NwZWNpZXMpKS90b3RhbF9yZWFkcw0KDQojQ2F1ZG92aXJpY2V0ZXMNCmNhdWRvdmlyYWxlcyA8LSBzdWJzZXRfdGF4YShQU1YsQ2xhc3M9PSJDYXVkb3ZpcmljZXRlcyIpDQpzdW0oc2FtcGxlX3N1bXMoY2F1ZG92aXJhbGVzKSkvdG90YWxfcmVhZHMNCg0KY2F1ZG92aXJhbGVzX3VuY2wgPC0gc3Vic2V0X3RheGEoY2F1ZG92aXJhbGVzLEdlbnVzPT0iVW5jbGFzc2lmaWVkIikNCnN1bShzYW1wbGVfc3VtcyhjYXVkb3ZpcmFsZXNfdW5jbCkpL3N1bShzYW1wbGVfc3VtcyhjYXVkb3ZpcmFsZXMpKQ0KDQpzdW0oc2FtcGxlX3N1bXMoY2F1ZG92aXJhbGVzX3VuY2wpKS90b3RhbF9yZWFkcw0KI0NsYXNzaWZpZWQgY2F1ZG92aXJhbGVzDQooc3VtKHNhbXBsZV9zdW1zKGNhdWRvdmlyYWxlcykpLXN1bShzYW1wbGVfc3VtcyhjYXVkb3ZpcmFsZXNfdW5jbCkpKS90b3RhbF9yZWFkcw0KYGBgDQoNCiMgQmFycGxvdHMNCg0KIyMgRmFtaWx5IGxldmVsDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9DQoNCg0KIyMjIyMjIyMjIyMjIyNCYWN0ZXJpYSBGYW1pbHkgbGV2ZWwNCg0KYmFjLnBoeWwgPC0gdGF4X2dsb20oUFNCLCAiRmFtaWx5IiwgTkFybSA9IEZBTFNFKQ0KDQpwczAgPC0gdHJhbnNmb3JtX3NhbXBsZV9jb3VudHMoYmFjLnBoeWwsIGZ1bmN0aW9uKHgpIHggLyBzdW0oeCkpDQoNCnBzMSA8LSBtZXJnZV9zYW1wbGVzKHBzMCwgIkRheXMiKQ0KDQpwczIgPC0gdHJhbnNmb3JtX3NhbXBsZV9jb3VudHMocHMxLCBmdW5jdGlvbih4KSB4IC8gc3VtKHgpKQ0KDQpkZiA8LSBwc21lbHQocHMyKQ0KDQojUmVwbGFjZSBtaXNzaW5nIHZhbHVlcyB3aXRoIE5BDQpkZltkZj09IiJdIDwtIE5BDQoNCiNTZWxlY3QgbGFzdCBub24tZW1wdHkgdGF4b25vbWljIHJhbmsNCmRmJHRheCA8LSBhcHBseShkZiwgMSwgZnVuY3Rpb24oeCkgdGFpbChzdGF0czo6bmEub21pdCh4KSwgMSkpDQoNCiNBZGQgInVua25vd24iIHRvIHRheG9ub215IGNvbHVtbnMgd2hlcmUgZ2VudXMgaXMgbm90IGNsYXNzaWZpZWQgDQpkZiR0YXhbaXMubmEoZGYkR2VudXMpXSA8LSBwYXN0ZTAoZGYkdGF4W2lzLm5hKGRmJEdlbnVzKV0sIiB1bmtub3duIikNCg0KI0FycmFuZ2Ugc2FtcGxlcyBieSBtZWFuIGFidW5kYW5jZQ0KDQp0b3AgPC0gZGYgJT4lDQogIGdyb3VwX2J5KFNhbXBsZSwgdGF4KSAlPiUNCiAgZHBseXI6OnN1bW1hcml6ZShNZWFuID0gbWVhbihBYnVuZGFuY2UpKSAlPiUNCiAgZHBseXI6OmFycmFuZ2UoLU1lYW4pDQojU2hvdyB0b3ANCiN0b3ANCg0KdG9wMTAgPC0gdG9wJHRheFsxOjIwXQ0KI1NlbGVjdCBkaXNlcmVkIHRheG9ub21pYyBsZXZlbA0KZGYwIDwtIGRmICU+JQ0KICBtdXRhdGUodGF4ID0gZmN0X290aGVyKHRheCwgYyhhcy5tYXRyaXgodG9wMTApKSkpDQoNCiNCYXIgY2hhcnQNCg0KZGYwJHRheCA8LSBmb3JjYXRzOjpmY3RfcmVvcmRlcihkZjAkdGF4LCBkZjAkQWJ1bmRhbmNlLCAuZnVuID0gbWVhbikNCmxhYmVscyA9IGxldmVscyhkZjAkdGF4KQ0KbGFiZWxzW2xhYmVscyAhPSAiT3RoZXIiXSA8LSBwYXN0ZTAoIioiLCBsYWJlbHNbbGFiZWxzICE9ICJPdGhlciJdLCAiKiIpDQoNCmJhcl9iYWNfZmFtIDwtIGdncGxvdChkZjAsIGFlcyhTYW1wbGUsIEFidW5kYW5jZSwgZmlsbCA9IHRheCkpICsgDQogIGdlb21fY29sKCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9cmVwKGNvbF9maWwsNSksbmFtZT0iRmFtaWx5IixsYWJlbHMgPSBsYWJlbHMpKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShsZWdlbmQudGV4dCA9IGdndGV4dDo6ZWxlbWVudF9tYXJrZG93bigpKSArDQogIGdndGl0bGUoIkJhY3RlcmlhIikgKw0KICB4bGFiKCJEYXlzIGFmdGVyIGJpcnRoIikgKw0KICB5bGFiKCJSZWxhdGl2ZSBhYnVuZGFuY2UiKQ0KDQoNCiNiYXJfYmFjDQoNCiNWaXJvbWUNCg0KYmFjLnBoeWwgPC0gdGF4X2dsb20oUFNWLCB0YXhyYW5rPSJPcmRlciIsIE5Bcm0gPSBGQUxTRSkNCg0KcHMwIDwtIHRyYW5zZm9ybV9zYW1wbGVfY291bnRzKGJhYy5waHlsLCBmdW5jdGlvbih4KSB4IC8gc3VtKHgpKQ0KDQpwczEgPC0gbWVyZ2Vfc2FtcGxlcyhwczAsICJEYXlzIikNCg0KcHMyIDwtIHRyYW5zZm9ybV9zYW1wbGVfY291bnRzKHBzMSwgZnVuY3Rpb24oeCkgeCAvIHN1bSh4KSkNCg0KDQojU2VsZWN0IGRlc2lyZWQgcmFuaw0KDQpkZiA8LSBwc21lbHQocHMyKQ0KDQojU2VsZWN0IGxhc3Qgbm9uLWVtcHR5IHRheG9ub21pYyByYW5rDQoNCmRmW2RmPT0iIl0gPC0gTkENCg0KZGYkdGF4IDwtIGFwcGx5KGRmLCAxLCBmdW5jdGlvbih4KSB0YWlsKG5hLm9taXQoeCksIDEpKQ0KDQp0b3AgPC0gZGYgJT4lDQogIGdyb3VwX2J5KFNhbXBsZSwgdGF4KSAlPiUNCiAgZHBseXI6OnN1bW1hcml6ZShNZWFuID0gbWVhbihBYnVuZGFuY2UpKSAlPiUNCiAgZHBseXI6OmFycmFuZ2UoLU1lYW4pDQojU2hvdyB0b3ANCiN0b3ANCg0KdG9wMTAgPC0gdG9wJHRheFsxOjIwXQ0KZGYwIDwtIGRmICU+JQ0KICBtdXRhdGUodGF4ID0gZmN0X290aGVyKHRheCwgYyhhcy5tYXRyaXgodG9wMTApKSkpDQoNCiNDaGFuZ2UgIlVua25vd24iIHRvICJVbmtub3duIHZpcnVzIiBhbmQgIk5vX21hdGNoIiB0byAiTm8gbWF0Y2giDQoNCmRmMCR0YXggPC0gcGx5cjo6cmV2YWx1ZShkZjAkdGF4LCBjKCJVbmtub3duIj0iVW5rbm93biB2aXJ1cyIpKQ0KZGYwJHRheCA8LSBwbHlyOjpyZXZhbHVlKGRmMCR0YXgsIGMoIm5vX21hdGNoIj0iTm8gbWF0Y2giKSkNCg0KI0FkZCAidW5rbm93biIgdG8gdGF4b25vbXkgY29sdW1ucyB3aGVyZSBnZW51cyBpcyBub3QgY2xhc3NpZmllZCANCiMkdGF4W2lzLm5hKGRmJEdlbnVzKV0gPC0gcGFzdGUwKGRmJHRheFtpcy5uYShkZiRHZW51cyldLCIgdW5rbm93biIpDQoNCiNCYXIgY2hhcnQNCg0KZGYwJHRheCA8LSBmb3JjYXRzOjpmY3RfcmVvcmRlcihkZjAkdGF4LCBkZjAkQWJ1bmRhbmNlLCAuZnVuID0gbWVhbikNCmxhYmVscyA9IGxldmVscyhkZjAkdGF4KQ0KbGFiZWxzW2xhYmVscyAhPSAiVW5jbGFzc2lmaWVkIl0gPC0gcGFzdGUwKCIqIiwgbGFiZWxzW2xhYmVscyAhPSAiVW5jbGFzc2lmaWVkIl0sICIqIikNCg0KYmFyX3Zpcl9mYW1pbHkgPC0gZ2dwbG90KGRmMCwgYWVzKFNhbXBsZSwgQWJ1bmRhbmNlLCBmaWxsID0gdGF4KSkgKyANCiAgZ2VvbV9jb2woKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1yZXAoY29sX2ZpbCw1KSxuYW1lPSJGYW1pbHkiLGxhYmVscyA9IGxhYmVscykrDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZ2d0ZXh0OjplbGVtZW50X21hcmtkb3duKCkpICsNCiAgZ2d0aXRsZSgiVmlyb21lIikgKw0KICB4bGFiKCJEYXlzIGFmdGVyIGJpcnRoIikgKw0KICB5bGFiKCJSZWxhdGl2ZSBhYnVuZGFuY2UiKQ0KDQojYmFyX3Zpcl9mYW1pbHkNCg0KcGxvdF9ncmlkKGJhcl9iYWNfZmFtLGJhcl92aXJfZmFtaWx5KQ0KYGBgDQoNCiMjIEJhY3RlcmlhbCBnZW5lcmEgcGx1cyB2aXJhbCBob3N0IHByZWRpY3Rpb25zDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9DQoNCnNsKFBTQi5nZW51cyx0YXhfZ2xvbShQU0IsICJHZW51cyIsIE5Bcm0gPSBGQUxTRSkpDQoNCnBzMCA8LSB0cmFuc2Zvcm1fc2FtcGxlX2NvdW50cyhQU0IuZ2VudXMsIGZ1bmN0aW9uKHgpIHggLyBzdW0oeCkpDQoNCnBzMSA8LSBtZXJnZV9zYW1wbGVzKHBzMCwgIkRheXMiKQ0KDQpwczIgPC0gdHJhbnNmb3JtX3NhbXBsZV9jb3VudHMocHMxLCBmdW5jdGlvbih4KSB4IC8gc3VtKHgpKQ0KDQpkZiA8LSBwc21lbHQocHMyKQ0KDQojUmVwbGFjZSBtaXNzaW5nIHZhbHVlcyB3aXRoIE5BDQpkZltkZj09IiJdIDwtIE5BDQoNCiNTZWxlY3QgbGFzdCBub24tZW1wdHkgdGF4b25vbWljIHJhbmsNCmRmJHRheCA8LSBhcHBseShkZiwgMSwgZnVuY3Rpb24oeCkgdGFpbChzdGF0czo6bmEub21pdCh4KSwgMSkpDQoNCiNBZGQgInVua25vd24iIHRvIHRheG9ub215IGNvbHVtbnMgd2hlcmUgZ2VudXMgaXMgbm90IGNsYXNzaWZpZWQgDQpkZiR0YXhbaXMubmEoZGYkR2VudXMpXSA8LSBwYXN0ZTAoZGYkdGF4W2lzLm5hKGRmJEdlbnVzKV0sIiB1bmtub3duIikNCg0KI0FycmFuZ2Ugc2FtcGxlcyBieSBtZWFuIGFidW5kYW5jZQ0KDQp0b3AgPC0gZGYgJT4lDQogIGdyb3VwX2J5KFNhbXBsZSwgdGF4KSAlPiUNCiAgZHBseXI6OnN1bW1hcml6ZShNZWFuID0gbWVhbihBYnVuZGFuY2UpKSAlPiUNCiAgZHBseXI6OmFycmFuZ2UoLU1lYW4pDQojU2hvdyB0b3ANCiN0b3ANCg0KdG9wMTAgPC0gdG9wJHRheFsxOjIwXQ0KI1NlbGVjdCBkaXNlcmVkIHRheG9ub21pYyBsZXZlbA0KZGYwIDwtIGRmICU+JQ0KICBtdXRhdGUodGF4ID0gZmN0X290aGVyKHRheCwgYyhhcy5tYXRyaXgodG9wMTApKSkpDQoNCiNCYXIgY2hhcnQNCmRmMCR0YXggPC0gZm9yY2F0czo6ZmN0X3Jlb3JkZXIoZGYwJHRheCwgZGYwJEFidW5kYW5jZSwgLmZ1biA9IG1lYW4pDQpsYWJlbHMgPSBsZXZlbHMoZGYwJHRheCkNCmxhYmVsc1tsYWJlbHMgIT0gIk90aGVyIl0gPC0gcGFzdGUwKCIqIiwgbGFiZWxzW2xhYmVscyAhPSAiT3RoZXIiXSwgIioiKQ0KbGFiZWxzIDwtIGdzdWIoIiB1bmtub3duXFwqIiwgIlxcKiB1bmtub3duIiwgbGFiZWxzKSAjb21pdCAidWtub3duIiBmcm9tIGl0YWxpYyBmYWNlDQoNCmJhcl9iYWMgPC0gZ2dwbG90KGRmMCwgYWVzKFNhbXBsZSwgQWJ1bmRhbmNlLCBmaWxsID0gdGF4KSkgKyANCiAgZ2VvbV9jb2woKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1yZXAoY29sX2ZpbCw1KSxuYW1lPSJHZW51cyIsbGFiZWxzID0gbGFiZWxzKSsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnRleHQgPSBnZ3RleHQ6OmVsZW1lbnRfbWFya2Rvd24oKSkgKw0KICBnZ3RpdGxlKCJCYWN0ZXJpYSIpICsNCiAgeGxhYigiRGF5cyBhZnRlciBiaXJ0aCIpICsNCiAgeWxhYigiUmVsYXRpdmUgYWJ1bmRhbmNlIikNCg0KYmFyX2JhYw0KDQpzbChQU1YuZ2VudXMsdGF4X2dsb20oUFNWLmhvc3QsICJHZW51cyIsIE5Bcm0gPSBGQUxTRSkpDQoNCnBzMCA8LSB0cmFuc2Zvcm1fc2FtcGxlX2NvdW50cyhQU1YuZ2VudXMsIGZ1bmN0aW9uKHgpIHggLyBzdW0oeCkpDQoNCnBzMSA8LSBtZXJnZV9zYW1wbGVzKHBzMCwgIkRheXMiKQ0KDQpwczIgPC0gdHJhbnNmb3JtX3NhbXBsZV9jb3VudHMocHMxLCBmdW5jdGlvbih4KSB4IC8gc3VtKHgpKQ0KDQpkZiA8LSBwc21lbHQocHMyKQ0KDQojUmVwbGFjZSBtaXNzaW5nIHZhbHVlcyB3aXRoIE5BDQpkZltkZj09IiJdIDwtIE5BDQoNCiNTZWxlY3QgbGFzdCBub24tZW1wdHkgdGF4b25vbWljIHJhbmsNCmRmJHRheCA8LSBhcHBseShkZiwgMSwgZnVuY3Rpb24oeCkgdGFpbChzdGF0czo6bmEub21pdCh4KSwgMSkpDQoNCiNBZGQgInVua25vd24iIHRvIHRheG9ub215IGNvbHVtbnMgd2hlcmUgZ2VudXMgaXMgbm90IGNsYXNzaWZpZWQgDQpkZiR0YXhbaXMubmEoZGYkR2VudXMpXSA8LSBwYXN0ZTAoZGYkdGF4W2lzLm5hKGRmJEdlbnVzKV0sIiB1bmtub3duIikNCg0KI0FycmFuZ2Ugc2FtcGxlcyBieSBtZWFuIGFidW5kYW5jZQ0KDQp0b3AgPC0gZGYgJT4lDQogIGdyb3VwX2J5KFNhbXBsZSwgdGF4KSAlPiUNCiAgZHBseXI6OnN1bW1hcml6ZShNZWFuID0gbWVhbihBYnVuZGFuY2UpKSAlPiUNCiAgZHBseXI6OmFycmFuZ2UoLU1lYW4pDQojU2hvdyB0b3ANCiN0b3ANCg0KdG9wMTAgPC0gdG9wJHRheFsxOjE4XQ0KI1NlbGVjdCBkaXNlcmVkIHRheG9ub21pYyBsZXZlbA0KZGYwIDwtIGRmICU+JQ0KICBtdXRhdGUodGF4ID0gZmN0X290aGVyKHRheCwgYyhhcy5tYXRyaXgodG9wMTApKSkpDQoNCiNCYXIgY2hhcnQNCmRmMCR0YXggPC0gZm9yY2F0czo6ZmN0X3Jlb3JkZXIoZGYwJHRheCwgZGYwJEFidW5kYW5jZSwgLmZ1biA9IG1lYW4pDQpsYWJlbHMgPSBsZXZlbHMoZGYwJHRheCkNCmxhYmVsc1tsYWJlbHMgIT0gIk90aGVyIl0gPC0gcGFzdGUwKCIqIiwgbGFiZWxzW2xhYmVscyAhPSAiT3RoZXIiXSwgIioiKQ0KDQpiYXJfaG9zdCA8LSBnZ3Bsb3QoZGYwLCBhZXMoU2FtcGxlLCBBYnVuZGFuY2UsIGZpbGwgPSB0YXgpKSArIA0KICBnZW9tX2NvbCgpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPXJlcChjb2xfZmlsLDUpLG5hbWU9IkdlbnVzIixsYWJlbHMgPSBsYWJlbHMpKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShsZWdlbmQudGV4dCA9IGdndGV4dDo6ZWxlbWVudF9tYXJrZG93bigpKSArDQogIGdndGl0bGUoIlZpcmFsIGhvc3RzIikgKw0KICB4bGFiKCJEYXlzIGFmdGVyIGJpcnRoIikgKw0KICB5bGFiKCJSZWxhdGl2ZSBhYnVuZGFuY2UiKQ0KDQojYmFyX2hvc3QNCg0KcGxvdF9ncmlkKGJhcl9iYWMsYmFyX2hvc3QpDQoNCmBgYA0KDQojIEFidW5kYW5jZSBoZWF0bWFwcw0KDQojIyBCYWN0ZXJpYQ0KDQojIyMgR2VudXMNCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gIEYsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD00LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0NCiNMb2FkIHBoeWxvc2VxIGZpbGVzIHRvIGFtcHZpczIgZm9ybWF0DQpQU0JhbXAgPC0gYW1wdmlzMjo6YW1wX2xvYWQoUFNCKQ0KDQojI1Bsb3QgaGVhbWFwDQoNCiMjQmFjdGVyaWENCmFtcF9iYWNfZ2VudXMgPC0gYW1wX2hlYXRtYXAoUFNCYW1wLA0KICAgICAgICAgICAgZ3JvdXBfYnkgPSAiVHdpbl9wYWlyc19iaXMiLA0KICAgICAgICAgICAgZmFjZXRfYnkgPSAiRGF5cyIsDQogICAgICAgICAgICBwbG90X3ZhbHVlcyA9IEZBTFNFLA0KICAgICAgICAgICAgdGF4X3Nob3cgPSAzMCwNCiAgICAgICAgICAgIHRheF9hZ2dyZWdhdGUgPSAiR2VudXMiICwNCiAgICAgICAgICAgIHRheF9hZGQgPSBOVUxMLA0KICAgICAgICAgICAgdGF4X2VtcHR5ID0gImJlc3QiLA0KICAgICAgICAgICAgbm9ybWFsaXNlID0gVFJVRSwNCiAgICAgICAgICAgIGNvbG9yX3ZlY3RvciA9IGMoIndoaXRlIiwgInJlZCIpLA0KICAgICAgICAgICAgcGxvdF9jb2xvcnNjYWxlID0gInNxcnQiLA0KICAgICAgICAgICAgcGxvdF9sZWdlbmRicmVha3MgPSBjKDEsIDEwLCAyNSwgNTApDQopICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAid2hpdGUiLCBmaWxsID0gIndoaXRlIiksDQogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwNCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlID0gLTQ1LCBoanVzdCA9IDAsdmp1c3QgPSAwLjIpLA0KICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X3RleHQoZmFjZT0iaXRhbGljIikpICsNCiAgc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9ZnVuY3Rpb24obGFiZWxzKSBzdHJfcmVwbGFjZV9hbGwobGFiZWxzLCBjKCJ6T1RVXyIgPSAidW5sYXNzaWZpZWRfIiwgIm9fXyIgPSAiIiwgImNfXyIgPSAiIikpKQ0KDQphbXBfYmFjX2dlbnVzDQoNCmBgYA0KDQojIyMgU3BlY2llcw0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgbWVzc2FnZSA9IEYsIHdhcm5pbmcgPSAgRiwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTQsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQ0KI0xvYWQgcGh5bG9zZXEgZmlsZXMgdG8gYW1wdmlzMiBmb3JtYXQNClBTQmFtcCA8LSBhbXB2aXMyOjphbXBfbG9hZChQU0IpDQoNCiMjUGxvdCBoZWFtYXANCg0KIyNCYWN0ZXJpYQ0KYW1wX2JhY19zcGVjaWVzIDwtIGFtcF9oZWF0bWFwKFBTQmFtcCwNCiAgICAgICAgICAgIGdyb3VwX2J5ID0gIlR3aW5fcGFpcnNfYmlzIiwNCiAgICAgICAgICAgIGZhY2V0X2J5ID0gIkRheXMiLA0KICAgICAgICAgICAgcGxvdF92YWx1ZXMgPSBGQUxTRSwNCiAgICAgICAgICAgIHRheF9zaG93ID0gMzAsDQogICAgICAgICAgICB0YXhfYWdncmVnYXRlID0gIlNwZWNpZXMiICwNCiAgICAgICAgICAgIHRheF9hZGQgPSBOVUxMLA0KICAgICAgICAgICAgdGF4X2VtcHR5ID0gImJlc3QiLA0KICAgICAgICAgICAgbm9ybWFsaXNlID0gVFJVRSwNCiAgICAgICAgICAgIGNvbG9yX3ZlY3RvciA9IGMoIndoaXRlIiwgInJlZCIpLA0KICAgICAgICAgICAgcGxvdF9jb2xvcnNjYWxlID0gInNxcnQiLA0KICAgICAgICAgICAgcGxvdF9sZWdlbmRicmVha3MgPSBjKDEsIDEwLCAyNSwgNTApDQopICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAid2hpdGUiLCBmaWxsID0gIndoaXRlIiksDQogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwNCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlID0gLTQ1LCBoanVzdCA9IDAsdmp1c3QgPSAwLjIpLA0KICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X3RleHQoZmFjZT0iaXRhbGljIikpDQoNCmFtcF9iYWNfc3BlY2llcw0KDQpgYGANCg0KIyMgVmlyb21lDQoNCiMjIyBHZW51cw0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgbWVzc2FnZSA9IEYsIHdhcm5pbmcgPSAgRiwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTQsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQ0KI0xvYWQgcGh5bG9zZXEgZmlsZXMgdG8gYW1wdmlzMiBmb3JtYXQNCg0KUFNWYW1wIDwtIGFtcHZpczI6OmFtcF9sb2FkKFBTVi5uby5yZWFsbSkgIA0KDQojI1Zpcm9tZQ0KDQphbXBfdmlyX2dlbnVzIDwtIGFtcF9oZWF0bWFwKFBTVmFtcCwNCiAgICAgICAgICAgIGdyb3VwX2J5ID0gIlR3aW5fcGFpcnNfdW5pcXVlIiwNCiAgICAgICAgICAgIGZhY2V0X2J5ID0gIkRheXMiLA0KICAgICAgICAgICAgcGxvdF92YWx1ZXMgPSBGQUxTRSwNCiAgICAgICAgICAgIHRheF9zaG93ID0gNDAsDQogICAgICAgICAgICB0YXhfYWdncmVnYXRlID0gIk9yZGVyIiwNCiAgICAgICAgICAgIHRheF9hZGQgPSAiQ2xhc3MiLA0KICAgICAgICAgICAgdGF4X2VtcHR5ID0gImJlc3QiLA0KICAgICAgICAgICAgbm9ybWFsaXNlID0gVFJVRSwNCiAgICAgICAgICAgIGNvbG9yX3ZlY3RvciA9IGMoIndoaXRlIiwgInJlZCIpLA0KICAgICAgICAgICAgcGxvdF9jb2xvcnNjYWxlID0gInNxcnQiLA0KICAgICAgICAgICAgcGxvdF9sZWdlbmRicmVha3MgPSBjKDEsIDEwLCAyNSwgNTApDQopICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIiksDQogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwNCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlID0gLTQ1LCBoanVzdCA9IDAsdmp1c3QgPSAwLjIpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKQ0KDQoNCmFtcF92aXJfZ2VudXMNCmBgYA0KDQojIyMgU3BlY2llcw0KDQpgYGB7cn0NClBTVmFtcCA8LSBhbXB2aXMyOjphbXBfbG9hZChQU1Yubm8ucmVhbG0pICANCg0KUFNWYW1wJHRheFtQU1ZhbXAkdGF4ID09ICJVbmNsYXNzaWZpZWQiXSA8LSAiIg0KI3Jvd25hbWVzKFBTVmFtcCR0YXgpIDwtIGdzdWIoIk9UVSIsICJ2T1RVIiwgcm93bmFtZXMoUFNWYW1wJHRheCkpDQoNCiMjVmlyb21lDQoNCmFtcF92aXJfc3BlY2llcyA8LSBhbXBfaGVhdG1hcChQU1ZhbXAsDQogICAgICAgICAgICBncm91cF9ieSA9ICJUd2luX3BhaXJzX3VuaXF1ZSIsDQogICAgICAgICAgICBmYWNldF9ieSA9ICJEYXlzIiwNCiAgICAgICAgICAgIHBsb3RfdmFsdWVzID0gRkFMU0UsDQogICAgICAgICAgICB0YXhfc2hvdyA9IDMwLA0KICAgICAgICAgICAgdGF4X2FnZ3JlZ2F0ZSA9ICJHZW51cyIgLA0KICAgICAgICAgICAgdGF4X2FkZCA9IE5VTEwsDQogICAgICAgICAgICB0YXhfZW1wdHkgPSAiYmVzdCIsDQogICAgICAgICAgICBub3JtYWxpc2UgPSBUUlVFLA0KICAgICAgICAgICAgY29sb3JfdmVjdG9yID0gYygid2hpdGUiLCAicmVkIiksDQogICAgICAgICAgICBwbG90X2NvbG9yc2NhbGUgPSAic3FydCIsDQogICAgICAgICAgICBwbG90X2xlZ2VuZGJyZWFrcyA9IGMoMSwgMTAsIDI1LCA1MCkNCikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSwNCiAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGUgPSAtNDUsIGhqdXN0ID0gMCx2anVzdCA9IDAuMiksDQogICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChmYWNlPSJpdGFsaWMiKSkgKw0KICBzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz1mdW5jdGlvbihsYWJlbHMpIHN0cl9yZXBsYWNlX2FsbChsYWJlbHMsIGMoIk9UVV8iID0gInVubGFzc2lmaWVkXyIsICJvX18iID0gIiIsICJjX18iID0gIiIpKSkNCg0KDQoNCmFtcF92aXJfc3BlY2llcw0KDQpgYGANCg0KIyMgSG9zdCB2aXJvbWUNCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gIEYsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD00LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0NCg0KI0xvYWQgcGh5bG9zZXEgZmlsZXMgdG8gYW1wdmlzMiBmb3JtYXQNCg0KUFNWLmhvc3QuYW1wIDwtIGFtcHZpczI6OmFtcF9sb2FkKFBTVi5ob3N0KQ0KDQphbXBfaG9zdF9wYWlyIDwtIGFtcF9oZWF0bWFwKFBTVi5ob3N0LmFtcCwNCiAgICAgICAgICAgIGdyb3VwX2J5ID0gIlR3aW5fcGFpcnNfdW5pcXVlIiwNCiAgICAgICAgICAgIGZhY2V0X2J5ID0gIkRheXMiLA0KICAgICAgICAgICAgcGxvdF92YWx1ZXMgPSBGQUxTRSwNCiAgICAgICAgICAgIHRheF9zaG93ID0gMzAsDQogICAgICAgICAgICB0YXhfYWdncmVnYXRlID0gIkdlbnVzIiAsDQogICAgICAgICAgICB0YXhfYWRkID0gIkZhbWlseSIsDQogICAgICAgICAgICB0YXhfZW1wdHkgPSAiYmVzdCIsDQogICAgICAgICAgICBub3JtYWxpc2UgPSBUUlVFLA0KICAgICAgICAgICAgY29sb3JfdmVjdG9yID0gYygid2hpdGUiLCAicmVkIiksDQogICAgICAgICAgICBwbG90X2NvbG9yc2NhbGUgPSAic3FydCIsDQogICAgICAgICAgICBwbG90X2xlZ2VuZGJyZWFrcyA9IGMoMSwgMTAsIDI1LCA1MCkNCikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSwNCiAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGUgPSAtNDUsIGhqdXN0ID0gMCx2anVzdCA9IDAuMikpDQoNCmFtcF9ob3N0X3BhaXINCmBgYA0KDQojIFVwc2V0IHBsb3QNCg0KIyMgQmFjdGVyaWENCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gIEYsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD00LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0NCg0KbGlicmFyeShNaWNyb2Jpb3RhUHJvY2VzcykNCmxpYnJhcnkoVmVubkRpYWdyYW0pDQpsaWJyYXJ5KFVwU2V0UikNCg0KcHMgPC0gUFNCDQoNCnVwc2V0ZGEgPC0gZ2V0X3Vwc2V0KG9iaj1wcywgZmFjdG9yTmFtZXM9IkRheXMiKQ0KDQp1cHNldC5iYWMudGltZSA8LSB1cHNldCh1cHNldGRhLCANCiAgICAgIHNldHMuYmFyLmNvbG9yID0gIiM1NkI0RTkiLA0KICAgICAgb3JkZXIuYnkgPSAiZnJlcSIsIA0KICAgICAgZW1wdHkuaW50ZXJzZWN0aW9ucyA9ICJvbiIpDQoNCnVwc2V0LmJhYy50aW1lDQoNCg0KYGBgDQoNCiMjIFZpcm9tZQ0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgbWVzc2FnZSA9IEYsIHdhcm5pbmcgPSAgRiwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTQsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQ0KDQpsaWJyYXJ5KCJNaWNyb2Jpb3RhUHJvY2VzcyIpDQoNCnBzIDwtIFBTVg0KDQp1cHNldGRhIDwtIGdldF91cHNldChvYmo9cHMsIGZhY3Rvck5hbWVzPSJEYXlzIikNCg0KdXBzZXQudmlyLnRpbWUgPC0gdXBzZXQodXBzZXRkYSwgDQogICAgICBzZXRzLmJhci5jb2xvciA9ICIjNTZCNEU5IiwNCiAgICAgIG9yZGVyLmJ5ID0gImZyZXEiLCANCiAgICAgIGVtcHR5LmludGVyc2VjdGlvbnMgPSAib24iKSANCg0KdXBzZXQudmlyLnRpbWUNCmBgYA0KDQojIyBWaXJvbWUgaG9zdA0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgbWVzc2FnZSA9IEYsIHdhcm5pbmcgPSAgRiwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTQsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQ0KDQpsaWJyYXJ5KCJNaWNyb2Jpb3RhUHJvY2VzcyIpDQoNCnBzIDwtIFBTVi5ob3N0DQpwcyA8LSBzdWJzZXRfc2FtcGxlcyhwcywgIWlzLm5hKERheXMpKQ0KcHNAc2FtX2RhdGEkRGF5cyA8LSBhcy5mYWN0b3IocHNAc2FtX2RhdGEkRGF5cykNCg0KdXBzZXRkYSA8LSBnZXRfdXBzZXQob2JqPXBzLCBmYWN0b3JOYW1lcz0iRGF5cyIpDQoNCnVwc2V0LnZpci5ob3N0LnRpbWUgPC0gdXBzZXQodXBzZXRkYSwgDQogICAgICBzZXRzLmJhci5jb2xvciA9ICIjNTZCNEU5IiwNCiAgICAgIG9yZGVyLmJ5ID0gImZyZXEiLCANCiAgICAgIGVtcHR5LmludGVyc2VjdGlvbnMgPSAib24iKSANCg0KdXBzZXQudmlyLmhvc3QudGltZQ0KYGBgDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IEYsIGVjaG8gPSBGLCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGfQ0KI1VubG9hZCBNaWNyb2Jpb3RhIFByb2Nlc3MgcGFja2FnZSB0byBhdm9pZCBjb25mbGljdCB3aXRoIHRheF90YWJsZSBmb3JtIHBoeWxvc2VxDQpkZXRhY2gocGFja2FnZTpNaWNyb2Jpb3RhUHJvY2VzcykNCmBgYA0KDQojIEFscGhhIGRpdmVyc2l0eQ0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBGLCBlY2hvID0gRiwgbWVzc2FnZSA9IEYsIHdhcm5pbmcgPSAgRiwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTQsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQ0KDQojTm9ybWFsaXplIHRvIG1lYW4gcmVhZCBjb3VudA0KdG90YWwgPSBtZWRpYW4oc2FtcGxlX3N1bXMoUFNCKSkNCnN0YW5kZiA9IGZ1bmN0aW9uKHgsIHQ9dG90YWwpIHJvdW5kKHQgKiAoeCAvIHN1bSh4KSkpDQpQU0IuUiA9IHRyYW5zZm9ybV9zYW1wbGVfY291bnRzKFBTQiwgc3RhbmRmKQ0KDQojU2V0IGRlc2lyZWQgYWxwaGEgZGl2ZXJzaXR5IG1ldHJpY3MNCg0KYWxwaGFfbWV0IDwtIGMoIk9ic2VydmVkIiwgIlNoYW5ub24iLCAiQ2hhbzEiLCAiSW52U2ltcHNvbiIpDQoNCiMjIyMjIyMjIyMjQm94cGxvdHMNCg0KIyNUaW1lDQoNCnZhcmlhYmxlIDwtIGMoIkRheXMiKQ0KDQphbHBoYS5tZXRyaWNzLmJhYyA8LSBwbG90X3JpY2huZXNzKFBTQi5SLCBtZWFzdXJlcz1hbHBoYV9tZXQgLCB4PXZhcmlhYmxlLCBjb2xvcj12YXJpYWJsZSkgKyANCiAgZ2VvbV9ib3hwbG90KGFscGhhPTAuMSwgbHdkID0gMSkgKw0KICBzY2FsZV9jb2xvcl9qY28oKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgICAgICBheGlzLmxpbmU9ZWxlbWVudF9saW5lKHNpemU9MSksDQogICAgICAgIGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZSA9IDgsIGNvbG91ciA9ICJCbGFjayIpLA0KICAgICAgICBheGlzLnRpY2tzPWVsZW1lbnRfbGluZShzaXplPTEsIGNvbG91ciA9ICJCbGFjayIpLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJ3aGl0ZSIsIGZpbGwgPSAid2hpdGUiKSwNCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksDQogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgYW5nbGUgPSAwKSwNCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpDQogICkgKw0KICBsYWJzKHg9IkRheXMiLA0KICAgICAgIHk9IkFscGhhIGRpdmVyc2l0eSIpICsgDQogIGdndGl0bGUoIkJhY3RlcmlhIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsIDAuMTUpKSkNCg0KYWxwaGEubWV0cmljcy5iYWMNCmBgYA0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgd2FybmluZyA9IEZ9DQojI1JpY2huZXNzIC0gYWxsIHRpbWUgcG9pbnRzDQoNCnJpY2huZXNzID0gZXN0aW1hdGVfcmljaG5lc3MoUFNCLlIsIG1lYXN1cmVzID0gYWxwaGFfbWV0KQ0KDQojVGltZQ0KDQpyaWNoIDwtIGNiaW5kKHJpY2huZXNzLCB2YXJpYWJsZSA9IHNhbXBsZV9kYXRhKFBTQi5SKSREYXlzKQ0KDQpUdWtleUhTRChhb3YoU2hhbm5vbiB+IHZhcmlhYmxlLCByaWNoKSkNCmBgYA0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgbWVzc2FnZSA9IEYsIHdhcm5pbmcgPSAgRiwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTQsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQ0KDQojTm9ybWFsaXplIHRvIG1lYW4gcmVhZCBjb3VudA0KdG90YWwgPSBtZWRpYW4oc2FtcGxlX3N1bXMoUFNWKSkNCnN0YW5kZiA9IGZ1bmN0aW9uKHgsIHQ9dG90YWwpIHJvdW5kKHQgKiAoeCAvIHN1bSh4KSkpDQpQU0IuUiA9IHRyYW5zZm9ybV9zYW1wbGVfY291bnRzKFBTViwgc3RhbmRmKQ0KDQojU2V0IGRlc2lyZWQgYWxwaGEgZGl2ZXJzaXR5IG1ldHJpY3MNCg0KYWxwaGFfbWV0IDwtIGMoIk9ic2VydmVkIiwgIlNoYW5ub24iLCAiQ2hhbzEiLCAiSW52U2ltcHNvbiIpDQoNCiMjIyMjIyMjIyMjQm94cGxvdHMNCg0KIyNUaW1lDQoNCnZhcmlhYmxlIDwtIGMoIkRheXMiKQ0KDQphbHBoYS5tZXRyaWNzLnZpciA8LSBwbG90X3JpY2huZXNzKFBTQi5SLCBtZWFzdXJlcz1hbHBoYV9tZXQgLCB4PXZhcmlhYmxlLCBjb2xvcj12YXJpYWJsZSkgKyANCiAgZ2VvbV9ib3hwbG90KGFscGhhPTAuMSwgbHdkID0gMSkgKw0KICBzY2FsZV9jb2xvcl9qY28oKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgICAgICBheGlzLmxpbmU9ZWxlbWVudF9saW5lKHNpemU9MSksDQogICAgICAgIGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZSA9IDgsIGNvbG91ciA9ICJCbGFjayIpLA0KICAgICAgICBheGlzLnRpY2tzPWVsZW1lbnRfbGluZShzaXplPTEsIGNvbG91ciA9ICJCbGFjayIpLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJ3aGl0ZSIsIGZpbGwgPSAid2hpdGUiKSwNCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksDQogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgYW5nbGUgPSAwKSwNCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpDQogICkgKw0KICBsYWJzKHg9IkRheXMiLA0KICAgICAgIHk9IkFscGhhIGRpdmVyc2l0eSIpICArIA0KICBnZ3RpdGxlKCJWaXJvbWUiKSArDQogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwgMC4xNSkpKQ0KDQphbHBoYS5tZXRyaWNzLnZpcg0KYGBgDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCB3YXJuaW5nID0gRn0NCiMjUmljaG5lc3MgLSBhbGwgdGltZSBwb2ludHMNCg0KcmljaG5lc3MgPSBlc3RpbWF0ZV9yaWNobmVzcyhQU0IuUiwgbWVhc3VyZXMgPSBhbHBoYV9tZXQpDQoNCiNUaW1lDQoNCnJpY2ggPC0gY2JpbmQocmljaG5lc3MsIHZhcmlhYmxlID0gc2FtcGxlX2RhdGEoUFNCLlIpJERheXMpDQoNClR1a2V5SFNEKGFvdihTaGFubm9uIH4gdmFyaWFibGUsIHJpY2gpKQ0KDQpgYGANCg0KIyMgQmFjdGVyaWFsIGFuZCB2aXJhbCBzaGFubm9uIGRpdmVyc2l0eQ0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgd2FybmluZz1GfQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI0FscGhhIGRpdmVyc2l0eSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojI05vcm1hbGl6ZSBib3RoIGJhY3RlcmlhbCBhbmQgdmlyYWwgZGF0YSB0byBtZWFuIHJlYWQgY291bnQNCg0KDQpzdGFuZGYgPSBmdW5jdGlvbih4LCB0PXRvdGFsKSByb3VuZCh0ICogKHggLyBzdW0oeCkpKQ0KI2JhY3RlcmlhDQp0b3RhbCA9IG1lZGlhbihzYW1wbGVfc3VtcyhQU0IpKQ0KUFNCUiA9IHRyYW5zZm9ybV9zYW1wbGVfY291bnRzKFBTQiwgc3RhbmRmKQ0KI3Zpcm9tZQ0KdG90YWwgPSBtZWRpYW4oc2FtcGxlX3N1bXMoUFNWKSkNClBTVlIgPSB0cmFuc2Zvcm1fc2FtcGxlX2NvdW50cyhQU1YsIHN0YW5kZikNCg0KI1NldCBkZXNpcmVkIGFscGhhIGRpdmVyc2l0eSBtZXRyaWNzDQoNCiNhbGhhX21ldCA8LSBjKCJPYnNlcnZlZCIsICJTaGFubm9uIiwiQ2hhbzEiLCJBQ0UiKQ0KDQphbGhhX21ldCA8LSBjKCJTaGFubm9uIikgDQoNCg0KIyMjIyMjIyMjIyNCb3hwbG90cw0KDQojU2V0IGRheXMgYXMgZmFjdG9yDQojIHNhbXBsZV9kYXRhKFBTQlIpJERheXMgPSBhcy5mYWN0b3Ioc2FtcGxlX2RhdGEoUFNCUikkRGF5cykNCiMgc2FtcGxlX2RhdGEoUFNWUikkRGF5cyA9IGFzLmZhY3RvcihzYW1wbGVfZGF0YShQU1ZSKSREYXlzKQ0KDQojU2V0IHNpZ24gYXJndW1ldG5zDQpzeW1udW0uYXJncyA8LSBsaXN0KGN1dHBvaW50cyA9IGMoMCwgMC4wMDAxLCAwLjAwMSwgMC4wMSwgMC4wNSwgMSksIHN5bWJvbHMgPSBjKCIqKioqIiwgIioqKiIsICIqKiIsICIqIiwgIm5zIikpDQoNCg0KI0JhY3RlcmlhDQoNCiNteV9jb21wYXJpc29ucyA9IGxpc3QoIGMoIjAiLCAiMTUiKSwgYygiMzAiLCAiOTAiKSwgYygiMCIsIjMwIiksIGMoIjAiLCI5MCIpLCBjKCIxNSIsIjkwIikgKSAjQWxsIGNvbXBhcmlzb25zDQpteV9jb21wYXJpc29ucyA9IGxpc3QoIGMoIjMwIiwgIjkwIiksIGMoIjEiLCIzMCIpLCBjKCIxIiwiOTAiKSwgYygiMTUiLCI5MCIpICkgIyNDaG9vc2UgY29tcGFyaXNvbnMgLSBoaWRlIG5vbiBzaWduIGNvbXBhcmlzb25zDQoNCg0KYmFjLmFscGhhIDwtIHBsb3RfcmljaG5lc3MoUFNCUiwgbWVhc3VyZXM9YWxoYV9tZXQgLCB4PSJEYXlzIiwgY29sb3I9IkRheXMiKSArIA0KICBnZW9tX2JveHBsb3QoYWxwaGE9MC4xKSArDQogIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IG15X2NvbXBhcmlzb25zLCBtZXRob2QgPSAid2lsY294IiwgcGFpcmVkID0gRkFMU0UsIHN5bW51bS5hcmdzID0gc3ltbnVtLmFyZ3MpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIsaGp1c3QgPSAwLjUpLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkNCiAgICAgICAgKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jb2xfZmlsKSArDQogIGxhYnMoeSA9ICJTaGFubm9uIGRpdmVyc2l0eSIpICsNCiAgZ2d0aXRsZSgiQmFjdGVyaWEiKQ0KDQojYmFjLmFscGhhDQoNCiNWaXJvbWUNCg0KI215X2NvbXBhcmlzb25zID0gbGlzdCggYygiMSIsICIxNSIpLCBjKCIzMCIsICI5MCIpLCBjKCIxIiwiMzAiKSwgYygiMSIsIjkwIiksIGMoIjE1IiwiOTAiKSApDQpteV9jb21wYXJpc29ucyA9IGxpc3QoIGMoIjEiLCAiMTUiKSApICNTaWduIGNvbXBhcmlzb25zIA0KDQp2aXIuYWxwaGEgPC0gcGxvdF9yaWNobmVzcyhQU1ZSLCBtZWFzdXJlcz1hbGhhX21ldCAsIHg9IkRheXMiLCBjb2xvcj0iRGF5cyIpICsgDQogIGdlb21fYm94cGxvdChhbHBoYT0wLjEpICsNCiAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbXlfY29tcGFyaXNvbnMsIG1ldGhvZCA9ICJ3aWxjb3giLCBwYWlyZWQgPSBGQUxTRSwgc3ltbnVtLmFyZ3MgPSBzeW1udW0uYXJncykgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIixoanVzdCA9IDAuNSksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKQ0KICApICsNCiAgZ2VvbV9wb2ludChzaXplID0gMikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWNvbF9maWwpICsNCiAgbGFicyh5ID0gIiIpICsNCiAgZ2d0aXRsZSgiVmlyb21lIikNCg0KI3Zpci5hbHBoYQ0KDQphbHBoYV9kaXYgPC0gcGxvdF9ncmlkKGJhYy5hbHBoYSx2aXIuYWxwaGEpDQoNCmFscGhhX2Rpdg0KYGBgDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCB3YXJuaW5nPUZ9DQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjU3VwcGxlbWVudGFyeSAtIG11bHRpcGxlIG1lYXN1cmVzDQoNCiNTZXQgZGVzaXJlZCBhbHBoYSBkaXZlcnNpdHkgbWV0cmljcw0KDQphbGhhX21ldCA8LSBjKCJPYnNlcnZlZCIsIlNoYW5ub24iLCJJbnZTaW1wc29uIikNCg0KDQojIyMjIyMjIyMjI0JveHBsb3RzDQoNCiNTZXQgZGF5cyBhcyBmYWN0b3INCnNhbXBsZV9kYXRhKFBTQlIpJERheXMgPSBhcy5mYWN0b3Ioc2FtcGxlX2RhdGEoUFNCUikkRGF5cykNCnNhbXBsZV9kYXRhKFBTVlIpJERheXMgPSBhcy5mYWN0b3Ioc2FtcGxlX2RhdGEoUFNWUikkRGF5cykNCg0KI1NldCBzaWduIGFyZ3VtZXRucw0Kc3ltbnVtLmFyZ3MgPC0gbGlzdChjdXRwb2ludHMgPSBjKDAsIDAuMDAwMSwgMC4wMDEsIDAuMDEsIDAuMDUsIDEpLCBzeW1ib2xzID0gYygiKioqKiIsICIqKioiLCAiKioiLCAiKiIsICJucyIpKQ0KDQoNCiNCYWN0ZXJpYQ0KDQpteV9jb21wYXJpc29ucyA9IGxpc3QoIGMoIjEiLCAiMTUiKSwgYygiMzAiLCAiOTAiKSwgYygiMSIsIjMwIiksIGMoIjEiLCI5MCIpLCBjKCIxNSIsIjkwIikgKSAjQWxsIGNvbXBhcmlzb25zDQojbXlfY29tcGFyaXNvbnMgPSBsaXN0KGMoIjMwIiwgIjkwIiksYygiMTUiLCI5MCIpICkgIyNDaG9vc2UgY29tcGFyaXNvbnMgLSBoaWRlIG5vbiBzaWduIGNvbXBhcmlzb25zDQoNCg0KYmFjLmFscGhhLmFsbCA8LSBwbG90X3JpY2huZXNzKFBTQlIsIG1lYXN1cmVzPWFsaGFfbWV0ICwgeD0iRGF5cyIsIGNvbG9yPSJEYXlzIikgKyANCiAgZ2VvbV9ib3hwbG90KGFscGhhPTAuMSkgKw0KICBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBteV9jb21wYXJpc29ucywgbWV0aG9kID0gIndpbGNveCIsIHBhaXJlZCA9IEZBTFNFLCBzeW1udW0uYXJncyA9IHN5bW51bS5hcmdzKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiLGhqdXN0ID0gMC41KSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKQ0KICApICsNCiAgZ2VvbV9wb2ludChzaXplID0gMikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWNvbF9maWwpICsNCiAgbGFicyh5ID0gIkFscGhhIGRpdmVyc2l0eSIpICsNCiAgZ2d0aXRsZSgiQmFjdGVyaWEiKQ0KDQojYmFjLmFscGhhLmFsbA0KDQojVmlyb21lDQoNCnZpci5hbHBoYS5hbGwgPC0gcGxvdF9yaWNobmVzcyhQU1ZSLCBtZWFzdXJlcz1hbGhhX21ldCAsIHg9IkRheXMiLCBjb2xvcj0iRGF5cyIpICsgDQogIGdlb21fYm94cGxvdChhbHBoYT0wLjEpICsNCiAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbXlfY29tcGFyaXNvbnMsIG1ldGhvZCA9ICJ3aWxjb3giLCBwYWlyZWQgPSBGQUxTRSwgc3ltbnVtLmFyZ3MgPSBzeW1udW0uYXJncykgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIixoanVzdCA9IDAuNSksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkNCiAgKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jb2xfZmlsKSArDQogIGxhYnMoeSA9ICIiKSArDQogIGdndGl0bGUoIlZpcm9tZSIpDQoNCiN2aXIuYWxwaGEuYWxsDQoNCmFscGhhLmFsbCA8LSBwbG90X2dyaWQoYmFjLmFscGhhLmFsbCx2aXIuYWxwaGEuYWxsLGxlZ2VuZD1GLCBuY29sID0gMSkNCg0KYWxwaGEuYWxsIA0KYGBgDQoNCiMgQmV0YSBkaXZlcnNpdHkNCg0KIyMgRGF5cw0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9DQoNCiMjIyMjIyMjIyMjI1BhaXJ3aXNlIHBlcm1hbm92YSB0byBjYWxjdWxhdGUgc2lnbmlmaWNhbmNlDQoNCiMjQWRvbmlzDQoNCiNCYWN0ZXJpYQ0KYnJheS5QU0IgPC0gcGh5bG9zZXE6OmRpc3RhbmNlKFBTQi5DU1MsIG1ldGhvZCA9ICJicmF5IikNCg0KI21ha2UgYSBkYXRhIGZyYW1lIGZyb20gdGhlIHNhbXBsZV9kYXRhDQpzYW1wbGVkZi5QU0IgPC0gZGF0YS5mcmFtZShzYW1wbGVfZGF0YShQU0IuQ1NTKSkNCg0KYWRvbmlzLlBTQiA8LSBhZG9uaXMyKGJyYXkuUFNCIH4gRGF5cywgZGF0YSA9IHNhbXBsZWRmLlBTQikNCg0KDQojVmlyb21lDQpicmF5LlBTViA8LSBwaHlsb3NlcTo6ZGlzdGFuY2UoUFNWLkNTUywgbWV0aG9kID0gImJyYXkiKQ0KDQojIG1ha2UgYSBkYXRhIGZyYW1lIGZyb20gdGhlIHNhbXBsZV9kYXRhDQpzYW1wbGVkZi5QU1YgPC0gZGF0YS5mcmFtZShzYW1wbGVfZGF0YShQU1YuQ1NTKSkNCg0KYWRvbmlzLlBTViA8LSBhZG9uaXMyKGJyYXkuUFNWIH4gRGF5cywgZGF0YSA9IHNhbXBsZWRmLlBTVikNCg0KIyMjIyMjIyMgRG8gUENvQSBvcmRpbmF0aW9uIGJhc2VkIG9uIEJyYXktQ3VydGlzIGRpc3NpbWlsYXJpdHkNCg0KR1Aub3JkIDwtIG9yZGluYXRlKFBTQi5DU1MsICJQQ29BIiwgImJyYXkiKQ0KDQpiYWMuYmV0YSA9IHBsb3Rfb3JkaW5hdGlvbihQU0IuQ1NTLCBHUC5vcmQsIGNvbG9yPSJEYXlzIikgKyANCiAgc3RhdF9lbGxpcHNlKGFlcyhjb2xvciA9IERheXMpLGdlb20gPSAicG9seWdvbiIsIGxldmVsID0gMC45NSwgZmlsbCA9IE5BLCBzaXplID0gMSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9IGNvbF9maWwpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbF9maWwpICsNCiAgdGhlbWVfY2xhc3NpYygpICsgDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiLGhqdXN0ID0gMC41KSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF9ibGFuaygpDQogICkgKyANCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IERheXMpLCBjb2xvcj0gImJsYWNrIiAscGNoPTIxLCBzaXplID0gMy41KSArDQogIHNjYWxlX3hfcmV2ZXJzZSgpICsjIFJldmVydCB4LWF4aXMgdG8gbWF0Y2ggcGxvdHMNCiAgZ2d0aXRsZSgiQmFjdGVyaWEiKSArDQpnZ3Bsb3QyOjphbm5vdGF0ZSgidGV4dCIsIHggPSAtMC40NSwgeSA9IDAuNCwgbGFiZWwgPSAiUCA8IDAuMDAxIikgI0FkZCBwLXZhbHVlIGZyb20gYWRvbmlzDQoNCiNiYWMuYmV0YSANCg0KR1Aub3JkIDwtIG9yZGluYXRlKFBTVi5DU1MsICJQQ29BIiwgImJyYXkiKQ0KDQp2aXIuYmV0YSA9IHBsb3Rfb3JkaW5hdGlvbihQU1YuQ1NTLCBHUC5vcmQsIGNvbG9yPSJEYXlzIikgKyANCiAgc3RhdF9lbGxpcHNlKGFlcyhjb2xvciA9IERheXMpLGdlb20gPSAicG9seWdvbiIsIGxldmVsID0gMC45NSwgZmlsbCA9IE5BLCBzaXplID0gMSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9IGNvbF9maWwpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbF9maWwpICsNCiAgdGhlbWVfY2xhc3NpYygpICsgDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiLGhqdXN0ID0gMC41KSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF9ibGFuaygpDQogICkgKw0KICBnZW9tX3BvaW50KGFlcyhmaWxsID0gRGF5cyksIGNvbG9yPSAiYmxhY2siICxwY2g9MjEsIHNpemUgPSAzLjUpICsNCiAgI3NjYWxlX3lfcmV2ZXJzZSgpICsgIyBSZXZlcnQgeS1heGlzIHRvIG1hdGNoIHBsb3RzDQogIGdndGl0bGUoIlZpcm9tZSIpICsNCiAgZ2dwbG90Mjo6YW5ub3RhdGUoInRleHQiLCB4ID0gLTAuNiwgeSA9IC0wLjUsIGxhYmVsID0gIlAgPCAwLjAwMSIpICNBZGQgcC12YWx1ZSBmcm9tIGFkb25pcw0KDQojdmlyLmJldGENCg0KI0FycmFuZ2UgcGxvdHMNCg0KcGxvdF9ncmlkKGJhYy5iZXRhLCB2aXIuYmV0YSwgbnJvdyA9IDEpDQoNCmBgYA0KDQojIFdpdGhpbiB2cyBiZXR3ZWVuIHR3aW4gcGFpcnMgYnJheSBjdXJ0aXMgZGlzc2ltaWxhcml0eQ0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgbWVzc2FnZSA9IEZ9DQoNCnNvdXJjZSgiSGVscGVyX0Z1bmN0aW9ucy5SIikNCg0KIyMjIyMjIyMjIyMjI0dlbmVyYXRlIEJyYXkgY3VydGlzIHBhaXJ3aXNlIGRpc3RhbmNlIGRhdGEgZnJhbWU6DQoNCiNQU0IuQ1NTLnN1YiA8LSBzdWJzZXRfc2FtcGxlcyhQU0IuQ1NTLCBEYXlzID09ICI5MCIpIA0KDQojIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2Ugb2JqZWN0DQptZXRhZGF0YVN0b29sIDwtIGRhdGEuZnJhbWUoc2FtcGxlX2RhdGEoUFNCLkNTUykpDQoNCnVud2VpZ2h0ZWREaXN0IDwtIGFzLm1hdHJpeCh0KFBTQi5DU1NAb3R1X3RhYmxlKSkNCg0KdW53ZWlnaHRlZERpc3QgPC0gdmVnZGlzdCh1bndlaWdodGVkRGlzdCwgZGlzdCA9ICJicmF5IikNCg0KIyBDb2VyY2UgZGlzdGFuY2Ugb2JqZWN0IGludG8gbWF0cml4DQp1bndlaWdodGVkRGlzdE10eCA8LSBhcy5tYXRyaXgodW53ZWlnaHRlZERpc3QpDQoNCiMgTWVsdCBhbmQgcmVtb3ZlIHZhbHVlcyBvZiAwIHRvIGVsaW1pbmF0ZSBkaXN0YW5jZXMgb2YgZWFjaCBzYW1wbGUgdG8gaXRzZWxmDQp1bndlaWdodGVkRGlzdE10eF9tZWx0IDwtIHN1YnNldChyZXNoYXBlMjo6bWVsdCh1bndlaWdodGVkRGlzdE10eCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5uYW1lID0gIlVuaUZyYWNfRGlzdGFuY2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaUZyYWNfRGlzdGFuY2UgIT0gMCkNCg0KIyBDaGFuZ2UgVmFyMSBhbmQgVmFyMiBmcm9tIGZhY3RvcnMgdG8gY2hhcmFjdGVycyBmb3IgZWFzaWVyIHVzZSB3aXRoIGRwbHlyDQpmYWN0b3JDb2xzIDwtIGMoIlZhcjEiLCAiVmFyMiIpDQp1bndlaWdodGVkRGlzdE10eF9tZWx0W2ZhY3RvckNvbHNdIDwtIGxhcHBseSh1bndlaWdodGVkRGlzdE10eF9tZWx0W2ZhY3RvckNvbHNdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3RlcikNCg0KIyBBZGQgY29sdW1ucyBmb3IgbGF0ZXIgc3Vic2V0dGluZyB3aGVuIHBsb3R0aW5nLiAgVGhpcyBpbmZvcm1hdGlvbiB3aWxsIGdldA0KIyAgIHB1bGxlZCBmcm9tIHRoZSBtZXRhZGF0YSAobWV0YWRhdGFTdG9vbCkuICBXaXRoaW4gdGhlICpEaXN0TXR4X21lbHQgZGF0YSANCiMgICBmcmFtZXMsIHdlIG5lZWQgYSBjb2x1bW4gaW5kaWNhdGluZyB3aGV0aGVyIFZhcjEgYW5kIFZhcjIgYXJlIGluZmFudHMsDQojICAgbW90aGVycywgYW5kIHdoZXRoZXIgdGhleSdyZSByZWxhdGVkLg0KdW53ZWlnaHRlZERpc3RERiA8LSB1bndlaWdodGVkRGlzdE10eF9tZWx0DQoNCiMgQWRkIFZhcjEgYW5kIFZhcjIgVHlwZSBhbmQgWnlnb3NpdHkgY29sdW1ucw0KIyBQdXQgcm93bmFtZXMgYmFjayBpbiBtZXRhZGF0YVN0b29sLCB0aGVuIHVzZSB0aGUgcm93bmFtZXMgdG8gbG9jYXRlIG5lZWRlZCBpbmZvDQojIDwtIGNvbHVtbl90b19yb3duYW1lcyhtZXRhZGF0YVN0b29sLCB2YXIgPSAiVHdpbl9wYWlycyIpDQoNCnVud2VpZ2h0ZWREaXN0REYgPC0gdW53ZWlnaHRlZERpc3RERiAlPiUNCiAgbXV0YXRlKFZhcjFfVHlwZSA9IG1ldGFkYXRhU3Rvb2xbdW53ZWlnaHRlZERpc3RERiRWYXIxLCAiVHdpbl9wYWlycyJdLA0KICAgICAgICAgVmFyMl9UeXBlID0gbWV0YWRhdGFTdG9vbFt1bndlaWdodGVkRGlzdERGJFZhcjIsICJUd2luX3BhaXJzIl0pDQoNCiMgVG8gZWFzaWx5IGRldGVybWluZSB0aGUgcmVsYXRlZG5lc3Mgb2YgdGhlIHBhaXJlZCBzYW1wbGVzIGluIGVhY2ggcm93LA0KIyAgIGNyZWF0ZSAic2hvcnQgbmFtZXMiIHRvIHJlcGxhY2UgdGhlIGxvbmcgc2FtcGxlIG5hbWVzLg0KIyAgIEZpcnN0IHB1dCB0aGUgcm93bmFtZXMgYmFjayBpbnRvIGEgY29sdW1uLg0KDQptZXRhZGF0YVN0b29sIDwtIHJvd25hbWVzX3RvX2NvbHVtbihtZXRhZGF0YVN0b29sLCB2YXIgPSAiU2FtcGxlIikNCg0KbHV0X2RmIDwtIGRwbHlyOjpzZWxlY3QobWV0YWRhdGFTdG9vbCwgU2FtcGxlLCBUd2luX3BhaXJzLCBUd2luX3BhaXJzKQ0KDQojIGNvbnZlcnQgbHV0X2RmIGludG8gYSB2ZWN0b3INCmx1dCA8LSBhcy5jaGFyYWN0ZXIobHV0X2RmJFR3aW5fcGFpcnMpDQpuYW1lcyhsdXQpIDwtIGx1dF9kZiRTYW1wbGUNCg0KIyBBZGQgaW4gdGhlIHNob3J0IG5hbWVzIHRvIHRoZSBkaXN0YW5jZSBkYXRhIGZyYW1lcw0KdW53ZWlnaHRlZERpc3RERiRWYXIxX1Nob3J0TmFtZSA8LSBsdXRbdW53ZWlnaHRlZERpc3RERiRWYXIxXQ0KdW53ZWlnaHRlZERpc3RERiRWYXIyX1Nob3J0TmFtZSA8LSBsdXRbdW53ZWlnaHRlZERpc3RERiRWYXIyXQ0KDQojIEFkZCBhIGNvbHVtbiBpbmRpY2F0aW5nIHdoZXRoZXIgYSBnaXZlbiByb3cgKHBhaXJ3aXNlIGNvbXBhcmlzb24pIGlzIGJldHdlZW4NCiMgICB0d28gcmVsYXRlZCBvciB1bnJlbGF0ZWQgc2FtcGxlcy4NCiMgICBMb29wIG92ZXIgdGhlIHJvd3Mgb2YgdGhlIGRpc3RhbmNlIGRmLCBzcGxpdCBWYXIxIGFuZCBWYXIyIHNob3J0IG5hbWVzIGJ5IA0KIyAgICIuIiBkZWxpbWl0ZXIgYW5kIGNvbXBhcmUgdGhlIDJuZCBlbGVtZW50IG9mIHRoZSByZXN1bHRpbmcgbGlzdCB3aGljaCB3aWxsIGhvbGQgdGhlIA0KIyAgIFRhcnIgRmFtaWx5IElELA0KDQpBZGRQYWlyUmVsYXRpb24gPC0gZnVuY3Rpb24oZGYpIHsNCiAgDQogIG9sZERGIDwtIGRmDQogIA0KICBwYWlyUmVsYXRpb24gPC0gdmVjdG9yKG1vZGUgPSAiY2hhcmFjdGVyIiwgbGVuZ3RoID0gbnJvdyhvbGRERikpDQogIA0KICBmb3IgKGkgaW4gMTpucm93KG9sZERGKSkgew0KICAgIFZhcjFfc3BsaXQgPC0gc3Ryc3BsaXQoeCA9IGRmW2ksICJWYXIxX1Nob3J0TmFtZSJdLCBzcGxpdCA9ICJcXC4iKQ0KICAgIFZhcjJfc3BsaXQgPC0gc3Ryc3BsaXQoeCA9IGRmW2ksICJWYXIyX1Nob3J0TmFtZSJdLCBzcGxpdCA9ICJcXC4iKQ0KICAgIA0KICAgIGlmIChWYXIxX3NwbGl0W1sxXV1bWzFdXSA9PSBWYXIyX3NwbGl0W1sxXV1bWzFdXSkgew0KICAgICAgcGFpclJlbGF0aW9uW2ldIDwtICJCZXR3ZWVuIFxuIHR3aW5zIg0KICAgIH0gZWxzZSB7DQogICAgICBwYWlyUmVsYXRpb25baV0gPC0gIkJldHdlZW4gXG4gdW5yZWxhdGVkIg0KICAgIH0NCiAgfQ0KICANCiAgb2xkREYkUGFpcl9SZWxhdGlvbiA8LSBwYWlyUmVsYXRpb24NCiAgDQogIHJldHVybihvbGRERikNCiAgDQp9DQoNCnVud2VpZ2h0ZWREaXN0REYgPC0gQWRkUGFpclJlbGF0aW9uKHVud2VpZ2h0ZWREaXN0REYpDQoNCiNXZWlnaHRlZCBkaXN0YW5jZSBib3hwbG90cw0KDQpCcmF5UGxvdC5iYWMgPC0gDQogIA0KICBnZ3Bsb3QodW53ZWlnaHRlZERpc3RERixhZXMoUGFpcl9SZWxhdGlvbixVbmlGcmFjX0Rpc3RhbmNlLGZpbGwgPSBQYWlyX1JlbGF0aW9uKSkgKw0KICBnZW9tX2JveHBsb3QoYWVzKGZpbGwgPSBQYWlyX1JlbGF0aW9uKSxvdXRsaWVyLnNoYXBlPU5BKSsNCiAgIyAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIpICsNCiAgeWxhYigiQnJheS1DdXJ0aXMgZGlzc2ltaWxhcml0eSIpICsNCiAgeGxhYigiQmFjdGVyaWEiKSArDQogIHRoZW1lX3B1YmNsZWFuKCkgKw0KICBzY2FsZV9maWxsX2pjbygpICsNCiAgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIgLGxhYmVsLngubnBjID0gMC41KQ0KDQojQnJheVBsb3QuYmFjDQpgYGANCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gIEYsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD00LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0NCg0Kc291cmNlKCJIZWxwZXJfRnVuY3Rpb25zLlIiKQ0KDQojIyMjIyMjIyMjIyMjR2VuZXJhdGUgQnJheSBjdXJ0aXMgcGFpcndpc2UgZGlzdGFuY2UgZGF0YSBmcmFtZToNCg0KIyBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIG9iamVjdA0KbWV0YWRhdGFTdG9vbCA8LSBkYXRhLmZyYW1lKHNhbXBsZV9kYXRhKFBTVi5DU1MpKQ0KDQp1bndlaWdodGVkRGlzdCA8LSBhcy5tYXRyaXgodChQU1YuQ1NTQG90dV90YWJsZSkpDQoNCnVud2VpZ2h0ZWREaXN0IDwtIHZlZ2Rpc3QodW53ZWlnaHRlZERpc3QsIGRpc3QgPSAiYnJheSIpDQoNCiMgQ29lcmNlIGRpc3RhbmNlIG9iamVjdCBpbnRvIG1hdHJpeA0KdW53ZWlnaHRlZERpc3RNdHggPC0gYXMubWF0cml4KHVud2VpZ2h0ZWREaXN0KQ0KDQojIE1lbHQgYW5kIHJlbW92ZSB2YWx1ZXMgb2YgMCB0byBlbGltaW5hdGUgZGlzdGFuY2VzIG9mIGVhY2ggc2FtcGxlIHRvIGl0c2VsZg0KdW53ZWlnaHRlZERpc3RNdHhfbWVsdCA8LSBzdWJzZXQocmVzaGFwZTI6Om1lbHQodW53ZWlnaHRlZERpc3RNdHgsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICJVbmlGcmFjX0Rpc3RhbmNlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmlGcmFjX0Rpc3RhbmNlICE9IDApDQoNCiMgQ2hhbmdlIFZhcjEgYW5kIFZhcjIgZnJvbSBmYWN0b3JzIHRvIGNoYXJhY3RlcnMgZm9yIGVhc2llciB1c2Ugd2l0aCBkcGx5cg0KZmFjdG9yQ29scyA8LSBjKCJWYXIxIiwgIlZhcjIiKQ0KdW53ZWlnaHRlZERpc3RNdHhfbWVsdFtmYWN0b3JDb2xzXSA8LSBsYXBwbHkodW53ZWlnaHRlZERpc3RNdHhfbWVsdFtmYWN0b3JDb2xzXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIpDQoNCiMgQWRkIGNvbHVtbnMgZm9yIGxhdGVyIHN1YnNldHRpbmcgd2hlbiBwbG90dGluZy4gIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBnZXQNCiMgICBwdWxsZWQgZnJvbSB0aGUgbWV0YWRhdGEgKG1ldGFkYXRhU3Rvb2wpLiAgV2l0aGluIHRoZSAqRGlzdE10eF9tZWx0IGRhdGEgDQojICAgZnJhbWVzLCB3ZSBuZWVkIGEgY29sdW1uIGluZGljYXRpbmcgd2hldGhlciBWYXIxIGFuZCBWYXIyIGFyZSBpbmZhbnRzLA0KIyAgIG1vdGhlcnMsIGFuZCB3aGV0aGVyIHRoZXkncmUgcmVsYXRlZC4NCnVud2VpZ2h0ZWREaXN0REYgPC0gdW53ZWlnaHRlZERpc3RNdHhfbWVsdA0KDQojIEFkZCBWYXIxIGFuZCBWYXIyIFR5cGUgYW5kIFp5Z29zaXR5IGNvbHVtbnMNCiMgUHV0IHJvd25hbWVzIGJhY2sgaW4gbWV0YWRhdGFTdG9vbCwgdGhlbiB1c2UgdGhlIHJvd25hbWVzIHRvIGxvY2F0ZSBuZWVkZWQgaW5mbw0KIyA8LSBjb2x1bW5fdG9fcm93bmFtZXMobWV0YWRhdGFTdG9vbCwgdmFyID0gIlR3aW5fcGFpcnMiKQ0KDQp1bndlaWdodGVkRGlzdERGIDwtIHVud2VpZ2h0ZWREaXN0REYgJT4lDQogIG11dGF0ZShWYXIxX1R5cGUgPSBtZXRhZGF0YVN0b29sW3Vud2VpZ2h0ZWREaXN0REYkVmFyMSwgIlR3aW5fcGFpcnMiXSwNCiAgICAgICAgIFZhcjJfVHlwZSA9IG1ldGFkYXRhU3Rvb2xbdW53ZWlnaHRlZERpc3RERiRWYXIyLCAiVHdpbl9wYWlycyJdKQ0KDQojIFRvIGVhc2lseSBkZXRlcm1pbmUgdGhlIHJlbGF0ZWRuZXNzIG9mIHRoZSBwYWlyZWQgc2FtcGxlcyBpbiBlYWNoIHJvdywNCiMgICBjcmVhdGUgInNob3J0IG5hbWVzIiB0byByZXBsYWNlIHRoZSBsb25nIHNhbXBsZSBuYW1lcy4NCiMgICBGaXJzdCBwdXQgdGhlIHJvd25hbWVzIGJhY2sgaW50byBhIGNvbHVtbi4NCg0KbWV0YWRhdGFTdG9vbCA8LSByb3duYW1lc190b19jb2x1bW4obWV0YWRhdGFTdG9vbCwgdmFyID0gIlNhbXBsZSIpDQoNCmx1dF9kZiA8LSBkcGx5cjo6c2VsZWN0KG1ldGFkYXRhU3Rvb2wsIFNhbXBsZSwgVHdpbl9wYWlycywgVHdpbl9wYWlycykNCg0KIyBjb252ZXJ0IGx1dF9kZiBpbnRvIGEgdmVjdG9yDQpsdXQgPC0gYXMuY2hhcmFjdGVyKGx1dF9kZiRUd2luX3BhaXJzKQ0KbmFtZXMobHV0KSA8LSBsdXRfZGYkU2FtcGxlDQoNCiMgQWRkIGluIHRoZSBzaG9ydCBuYW1lcyB0byB0aGUgZGlzdGFuY2UgZGF0YSBmcmFtZXMNCnVud2VpZ2h0ZWREaXN0REYkVmFyMV9TaG9ydE5hbWUgPC0gbHV0W3Vud2VpZ2h0ZWREaXN0REYkVmFyMV0NCnVud2VpZ2h0ZWREaXN0REYkVmFyMl9TaG9ydE5hbWUgPC0gbHV0W3Vud2VpZ2h0ZWREaXN0REYkVmFyMl0NCg0KIyBBZGQgYSBjb2x1bW4gaW5kaWNhdGluZyB3aGV0aGVyIGEgZ2l2ZW4gcm93IChwYWlyd2lzZSBjb21wYXJpc29uKSBpcyBiZXR3ZWVuDQojICAgdHdvIHJlbGF0ZWQgb3IgdW5yZWxhdGVkIHNhbXBsZXMuDQojICAgTG9vcCBvdmVyIHRoZSByb3dzIG9mIHRoZSBkaXN0YW5jZSBkZiwgc3BsaXQgVmFyMSBhbmQgVmFyMiBzaG9ydCBuYW1lcyBieSANCiMgICAiLiIgZGVsaW1pdGVyIGFuZCBjb21wYXJlIHRoZSAybmQgZWxlbWVudCBvZiB0aGUgcmVzdWx0aW5nIGxpc3Qgd2hpY2ggd2lsbCBob2xkIHRoZSANCiMgICBUYXJyIEZhbWlseSBJRCwNCg0KQWRkUGFpclJlbGF0aW9uIDwtIGZ1bmN0aW9uKGRmKSB7DQogIA0KICBvbGRERiA8LSBkZg0KICANCiAgcGFpclJlbGF0aW9uIDwtIHZlY3Rvcihtb2RlID0gImNoYXJhY3RlciIsIGxlbmd0aCA9IG5yb3cob2xkREYpKQ0KICANCiAgZm9yIChpIGluIDE6bnJvdyhvbGRERikpIHsNCiAgICBWYXIxX3NwbGl0IDwtIHN0cnNwbGl0KHggPSBkZltpLCAiVmFyMV9TaG9ydE5hbWUiXSwgc3BsaXQgPSAiXFwuIikNCiAgICBWYXIyX3NwbGl0IDwtIHN0cnNwbGl0KHggPSBkZltpLCAiVmFyMl9TaG9ydE5hbWUiXSwgc3BsaXQgPSAiXFwuIikNCiAgICANCiAgICBpZiAoVmFyMV9zcGxpdFtbMV1dW1sxXV0gPT0gVmFyMl9zcGxpdFtbMV1dW1sxXV0pIHsNCiAgICAgIHBhaXJSZWxhdGlvbltpXSA8LSAiQmV0d2VlbiBcbiB0d2lucyINCiAgICB9IGVsc2Ugew0KICAgICAgcGFpclJlbGF0aW9uW2ldIDwtICJCZXR3ZWVuIFxuIHVucmVsYXRlZCINCiAgICB9DQogIH0NCiAgDQogIG9sZERGJFBhaXJfUmVsYXRpb24gPC0gcGFpclJlbGF0aW9uDQogIA0KICByZXR1cm4ob2xkREYpDQogIA0KfQ0KDQp1bndlaWdodGVkRGlzdERGIDwtIEFkZFBhaXJSZWxhdGlvbih1bndlaWdodGVkRGlzdERGKQ0KDQojV2VpZ2h0ZWQgZGlzdGFuY2UgYm94cGxvdHMNCg0KQnJheVBsb3QudmlyIDwtIA0KICANCiAgZ2dwbG90KHVud2VpZ2h0ZWREaXN0REYsYWVzKFBhaXJfUmVsYXRpb24sVW5pRnJhY19EaXN0YW5jZSxmaWxsID0gUGFpcl9SZWxhdGlvbikpICsNCiAgZ2VvbV9ib3hwbG90KGFlcyhmaWxsID0gUGFpcl9SZWxhdGlvbiksb3V0bGllci5zaGFwZT1OQSkrDQogICMgIGdlb21faml0dGVyKHdpZHRoID0gMC4yKSArDQogIHlsYWIoIkJyYXktQ3VydGlzIGRpc3NpbWlsYXJpdHkiKSArDQogIHhsYWIoIlZpcm9tZSIpICsNCiAgdGhlbWVfcHViY2xlYW4oKSArDQogIHNjYWxlX2ZpbGxfamNvKCkgKw0KICBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gIndpbGNveC50ZXN0IiAsbGFiZWwueC5ucGMgPSAwLjUpDQoNCiNCcmF5UGxvdC52aXINCg0KcGxvdF9ncmlkKEJyYXlQbG90LmJhYyxCcmF5UGxvdC52aXIsIG5yb3cgPSAxKQ0KYGBgDQoNCiMjIEluZGl2aWR1YWwgdGltZSBwb2ludHMNCg0KIyMjIERheSAxDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9DQpzb3VyY2UoIkhlbHBlcl9GdW5jdGlvbnMuUiIpDQoNClBTQi5DU1Muc3ViIDwtIHN1YnNldF9zYW1wbGVzKFBTQi5DU1MsIERheXMgPT0gIjEiKSANCg0KUFNWLkNTUy5zdWIgPC0gc3Vic2V0X3NhbXBsZXMoUFNWLkNTUywgRGF5cyA9PSAiMSIpIA0KDQojIyMjIyMjIyMjIyMjR2VuZXJhdGUgQnJheSBjdXJ0aXMgcGFpcndpc2UgZGlzdGFuY2UgZGF0YSBmcmFtZToNCg0KIyBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIG9iamVjdA0KbWV0YWRhdGFTdG9vbCA8LSBkYXRhLmZyYW1lKHNhbXBsZV9kYXRhKFBTQi5DU1Muc3ViKSkNCg0KdW53ZWlnaHRlZERpc3QgPC0gYXMubWF0cml4KHQoUFNCLkNTUy5zdWJAb3R1X3RhYmxlKSkNCg0KdW53ZWlnaHRlZERpc3QgPC0gdmVnZGlzdCh1bndlaWdodGVkRGlzdCwgZGlzdCA9ICJicmF5IikNCg0KIyBDb2VyY2UgZGlzdGFuY2Ugb2JqZWN0IGludG8gbWF0cml4DQp1bndlaWdodGVkRGlzdE10eCA8LSBhcy5tYXRyaXgodW53ZWlnaHRlZERpc3QpDQoNCiMgTWVsdCBhbmQgcmVtb3ZlIHZhbHVlcyBvZiAwIHRvIGVsaW1pbmF0ZSBkaXN0YW5jZXMgb2YgZWFjaCBzYW1wbGUgdG8gaXRzZWxmDQp1bndlaWdodGVkRGlzdE10eF9tZWx0IDwtIHN1YnNldChyZXNoYXBlMjo6bWVsdCh1bndlaWdodGVkRGlzdE10eCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5uYW1lID0gIlVuaUZyYWNfRGlzdGFuY2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaUZyYWNfRGlzdGFuY2UgIT0gMCkNCg0KIyBDaGFuZ2UgVmFyMSBhbmQgVmFyMiBmcm9tIGZhY3RvcnMgdG8gY2hhcmFjdGVycyBmb3IgZWFzaWVyIHVzZSB3aXRoIGRwbHlyDQpmYWN0b3JDb2xzIDwtIGMoIlZhcjEiLCAiVmFyMiIpDQp1bndlaWdodGVkRGlzdE10eF9tZWx0W2ZhY3RvckNvbHNdIDwtIGxhcHBseSh1bndlaWdodGVkRGlzdE10eF9tZWx0W2ZhY3RvckNvbHNdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3RlcikNCg0KIyBBZGQgY29sdW1ucyBmb3IgbGF0ZXIgc3Vic2V0dGluZyB3aGVuIHBsb3R0aW5nLiAgVGhpcyBpbmZvcm1hdGlvbiB3aWxsIGdldA0KIyAgIHB1bGxlZCBmcm9tIHRoZSBtZXRhZGF0YSAobWV0YWRhdGFTdG9vbCkuICBXaXRoaW4gdGhlICpEaXN0TXR4X21lbHQgZGF0YSANCiMgICBmcmFtZXMsIHdlIG5lZWQgYSBjb2x1bW4gaW5kaWNhdGluZyB3aGV0aGVyIFZhcjEgYW5kIFZhcjIgYXJlIGluZmFudHMsDQojICAgbW90aGVycywgYW5kIHdoZXRoZXIgdGhleSdyZSByZWxhdGVkLg0KdW53ZWlnaHRlZERpc3RERiA8LSB1bndlaWdodGVkRGlzdE10eF9tZWx0DQoNCiMgQWRkIFZhcjEgYW5kIFZhcjIgVHlwZSBhbmQgWnlnb3NpdHkgY29sdW1ucw0KIyBQdXQgcm93bmFtZXMgYmFjayBpbiBtZXRhZGF0YVN0b29sLCB0aGVuIHVzZSB0aGUgcm93bmFtZXMgdG8gbG9jYXRlIG5lZWRlZCBpbmZvDQojIDwtIGNvbHVtbl90b19yb3duYW1lcyhtZXRhZGF0YVN0b29sLCB2YXIgPSAiVHdpbl9wYWlycyIpDQoNCnVud2VpZ2h0ZWREaXN0REYgPC0gdW53ZWlnaHRlZERpc3RERiAlPiUNCiAgbXV0YXRlKFZhcjFfVHlwZSA9IG1ldGFkYXRhU3Rvb2xbdW53ZWlnaHRlZERpc3RERiRWYXIxLCAiVHdpbl9wYWlycyJdLA0KICAgICAgICAgVmFyMl9UeXBlID0gbWV0YWRhdGFTdG9vbFt1bndlaWdodGVkRGlzdERGJFZhcjIsICJUd2luX3BhaXJzIl0pDQoNCiMgVG8gZWFzaWx5IGRldGVybWluZSB0aGUgcmVsYXRlZG5lc3Mgb2YgdGhlIHBhaXJlZCBzYW1wbGVzIGluIGVhY2ggcm93LA0KIyAgIGNyZWF0ZSAic2hvcnQgbmFtZXMiIHRvIHJlcGxhY2UgdGhlIGxvbmcgc2FtcGxlIG5hbWVzLg0KIyAgIEZpcnN0IHB1dCB0aGUgcm93bmFtZXMgYmFjayBpbnRvIGEgY29sdW1uLg0KDQptZXRhZGF0YVN0b29sIDwtIHJvd25hbWVzX3RvX2NvbHVtbihtZXRhZGF0YVN0b29sLCB2YXIgPSAiU2FtcGxlIikNCg0KbHV0X2RmIDwtIGRwbHlyOjpzZWxlY3QobWV0YWRhdGFTdG9vbCwgU2FtcGxlLCBUd2luX3BhaXJzLCBUd2luX3BhaXJzKQ0KDQojIGNvbnZlcnQgbHV0X2RmIGludG8gYSB2ZWN0b3INCmx1dCA8LSBhcy5jaGFyYWN0ZXIobHV0X2RmJFR3aW5fcGFpcnMpDQpuYW1lcyhsdXQpIDwtIGx1dF9kZiRTYW1wbGUNCg0KIyBBZGQgaW4gdGhlIHNob3J0IG5hbWVzIHRvIHRoZSBkaXN0YW5jZSBkYXRhIGZyYW1lcw0KdW53ZWlnaHRlZERpc3RERiRWYXIxX1Nob3J0TmFtZSA8LSBsdXRbdW53ZWlnaHRlZERpc3RERiRWYXIxXQ0KdW53ZWlnaHRlZERpc3RERiRWYXIyX1Nob3J0TmFtZSA8LSBsdXRbdW53ZWlnaHRlZERpc3RERiRWYXIyXQ0KDQojIEFkZCBhIGNvbHVtbiBpbmRpY2F0aW5nIHdoZXRoZXIgYSBnaXZlbiByb3cgKHBhaXJ3aXNlIGNvbXBhcmlzb24pIGlzIGJldHdlZW4NCiMgICB0d28gcmVsYXRlZCBvciB1bnJlbGF0ZWQgc2FtcGxlcy4NCiMgICBMb29wIG92ZXIgdGhlIHJvd3Mgb2YgdGhlIGRpc3RhbmNlIGRmLCBzcGxpdCBWYXIxIGFuZCBWYXIyIHNob3J0IG5hbWVzIGJ5IA0KIyAgICIuIiBkZWxpbWl0ZXIgYW5kIGNvbXBhcmUgdGhlIDJuZCBlbGVtZW50IG9mIHRoZSByZXN1bHRpbmcgbGlzdCB3aGljaCB3aWxsIGhvbGQgdGhlIA0KIyAgIFRhcnIgRmFtaWx5IElELA0KDQpBZGRQYWlyUmVsYXRpb24gPC0gZnVuY3Rpb24oZGYpIHsNCiAgDQogIG9sZERGIDwtIGRmDQogIA0KICBwYWlyUmVsYXRpb24gPC0gdmVjdG9yKG1vZGUgPSAiY2hhcmFjdGVyIiwgbGVuZ3RoID0gbnJvdyhvbGRERikpDQogIA0KICBmb3IgKGkgaW4gMTpucm93KG9sZERGKSkgew0KICAgIFZhcjFfc3BsaXQgPC0gc3Ryc3BsaXQoeCA9IGRmW2ksICJWYXIxX1Nob3J0TmFtZSJdLCBzcGxpdCA9ICJcXC4iKQ0KICAgIFZhcjJfc3BsaXQgPC0gc3Ryc3BsaXQoeCA9IGRmW2ksICJWYXIyX1Nob3J0TmFtZSJdLCBzcGxpdCA9ICJcXC4iKQ0KICAgIA0KICAgIGlmIChWYXIxX3NwbGl0W1sxXV1bWzFdXSA9PSBWYXIyX3NwbGl0W1sxXV1bWzFdXSkgew0KICAgICAgcGFpclJlbGF0aW9uW2ldIDwtICJCZXR3ZWVuIFxuIHR3aW5zIg0KICAgIH0gZWxzZSB7DQogICAgICBwYWlyUmVsYXRpb25baV0gPC0gIkJldHdlZW4gXG4gdW5yZWxhdGVkIg0KICAgIH0NCiAgfQ0KICANCiAgb2xkREYkUGFpcl9SZWxhdGlvbiA8LSBwYWlyUmVsYXRpb24NCiAgDQogIHJldHVybihvbGRERikNCiAgDQp9DQoNCnVud2VpZ2h0ZWREaXN0REYgPC0gQWRkUGFpclJlbGF0aW9uKHVud2VpZ2h0ZWREaXN0REYpDQoNCiNXZWlnaHRlZCBkaXN0YW5jZSBib3hwbG90cw0KDQpCcmF5UGxvdC5iYWMuMCA8LSANCiAgDQogIGdncGxvdCh1bndlaWdodGVkRGlzdERGLGFlcyhQYWlyX1JlbGF0aW9uLFVuaUZyYWNfRGlzdGFuY2UsZmlsbCA9IFBhaXJfUmVsYXRpb24pKSArDQogIGdlb21fYm94cGxvdChhZXMoZmlsbCA9IFBhaXJfUmVsYXRpb24pLG91dGxpZXIuc2hhcGU9TkEpKw0KICAjICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMikgKw0KICB5bGFiKCJCcmF5LUN1cnRpcyBkaXNzaW1pbGFyaXR5IikgKw0KICB4bGFiKCJEYXkgMSIpICsNCiAgdGhlbWVfcHViY2xlYW4oKSArDQogIHNjYWxlX2ZpbGxfamNvKCkgKw0KICBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gIndpbGNveC50ZXN0IiAsYWVzKGxhYmVsID0gcGFzdGUwKCJwID0gIiwgLi5wLmZvcm1hdC4uKSksbGFiZWwueC5ucGM9ImNlbnRlciIsbGFiZWwueT0wLjYpICsNCiAgZ3VpZGVzKGZpbGw9Im5vbmUiKQ0KDQojQnJheVBsb3QuYmFjDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjVmlyb21lDQoNCiMjIyMjIyMjIyMjIyNHZW5lcmF0ZSBCcmF5IGN1cnRpcyBwYWlyd2lzZSBkaXN0YW5jZSBkYXRhIGZyYW1lOg0KDQojIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2Ugb2JqZWN0DQptZXRhZGF0YVN0b29sIDwtIGRhdGEuZnJhbWUoc2FtcGxlX2RhdGEoUFNWLkNTUy5zdWIpKQ0KDQp1bndlaWdodGVkRGlzdCA8LSBhcy5tYXRyaXgodChQU1YuQ1NTLnN1YkBvdHVfdGFibGUpKQ0KDQp1bndlaWdodGVkRGlzdCA8LSB2ZWdkaXN0KHVud2VpZ2h0ZWREaXN0LCBkaXN0ID0gImJyYXkiKQ0KDQojIENvZXJjZSBkaXN0YW5jZSBvYmplY3QgaW50byBtYXRyaXgNCnVud2VpZ2h0ZWREaXN0TXR4IDwtIGFzLm1hdHJpeCh1bndlaWdodGVkRGlzdCkNCg0KIyBNZWx0IGFuZCByZW1vdmUgdmFsdWVzIG9mIDAgdG8gZWxpbWluYXRlIGRpc3RhbmNlcyBvZiBlYWNoIHNhbXBsZSB0byBpdHNlbGYNCnVud2VpZ2h0ZWREaXN0TXR4X21lbHQgPC0gc3Vic2V0KHJlc2hhcGUyOjptZWx0KHVud2VpZ2h0ZWREaXN0TXR4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLm5hbWUgPSAiVW5pRnJhY19EaXN0YW5jZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pRnJhY19EaXN0YW5jZSAhPSAwKQ0KDQojIENoYW5nZSBWYXIxIGFuZCBWYXIyIGZyb20gZmFjdG9ycyB0byBjaGFyYWN0ZXJzIGZvciBlYXNpZXIgdXNlIHdpdGggZHBseXINCmZhY3RvckNvbHMgPC0gYygiVmFyMSIsICJWYXIyIikNCnVud2VpZ2h0ZWREaXN0TXR4X21lbHRbZmFjdG9yQ29sc10gPC0gbGFwcGx5KHVud2VpZ2h0ZWREaXN0TXR4X21lbHRbZmFjdG9yQ29sc10sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKQ0KDQojIEFkZCBjb2x1bW5zIGZvciBsYXRlciBzdWJzZXR0aW5nIHdoZW4gcGxvdHRpbmcuICBUaGlzIGluZm9ybWF0aW9uIHdpbGwgZ2V0DQojICAgcHVsbGVkIGZyb20gdGhlIG1ldGFkYXRhIChtZXRhZGF0YVN0b29sKS4gIFdpdGhpbiB0aGUgKkRpc3RNdHhfbWVsdCBkYXRhIA0KIyAgIGZyYW1lcywgd2UgbmVlZCBhIGNvbHVtbiBpbmRpY2F0aW5nIHdoZXRoZXIgVmFyMSBhbmQgVmFyMiBhcmUgaW5mYW50cywNCiMgICBtb3RoZXJzLCBhbmQgd2hldGhlciB0aGV5J3JlIHJlbGF0ZWQuDQp1bndlaWdodGVkRGlzdERGIDwtIHVud2VpZ2h0ZWREaXN0TXR4X21lbHQNCg0KIyBBZGQgVmFyMSBhbmQgVmFyMiBUeXBlIGFuZCBaeWdvc2l0eSBjb2x1bW5zDQojIFB1dCByb3duYW1lcyBiYWNrIGluIG1ldGFkYXRhU3Rvb2wsIHRoZW4gdXNlIHRoZSByb3duYW1lcyB0byBsb2NhdGUgbmVlZGVkIGluZm8NCiMgPC0gY29sdW1uX3RvX3Jvd25hbWVzKG1ldGFkYXRhU3Rvb2wsIHZhciA9ICJUd2luX3BhaXJzIikNCg0KdW53ZWlnaHRlZERpc3RERiA8LSB1bndlaWdodGVkRGlzdERGICU+JQ0KICBtdXRhdGUoVmFyMV9UeXBlID0gbWV0YWRhdGFTdG9vbFt1bndlaWdodGVkRGlzdERGJFZhcjEsICJUd2luX3BhaXJzIl0sDQogICAgICAgICBWYXIyX1R5cGUgPSBtZXRhZGF0YVN0b29sW3Vud2VpZ2h0ZWREaXN0REYkVmFyMiwgIlR3aW5fcGFpcnMiXSkNCg0KIyBUbyBlYXNpbHkgZGV0ZXJtaW5lIHRoZSByZWxhdGVkbmVzcyBvZiB0aGUgcGFpcmVkIHNhbXBsZXMgaW4gZWFjaCByb3csDQojICAgY3JlYXRlICJzaG9ydCBuYW1lcyIgdG8gcmVwbGFjZSB0aGUgbG9uZyBzYW1wbGUgbmFtZXMuDQojICAgRmlyc3QgcHV0IHRoZSByb3duYW1lcyBiYWNrIGludG8gYSBjb2x1bW4uDQoNCm1ldGFkYXRhU3Rvb2wgPC0gcm93bmFtZXNfdG9fY29sdW1uKG1ldGFkYXRhU3Rvb2wsIHZhciA9ICJTYW1wbGUiKQ0KDQpsdXRfZGYgPC0gZHBseXI6OnNlbGVjdChtZXRhZGF0YVN0b29sLCBTYW1wbGUsIFR3aW5fcGFpcnMsIFR3aW5fcGFpcnMpDQoNCiMgY29udmVydCBsdXRfZGYgaW50byBhIHZlY3Rvcg0KbHV0IDwtIGFzLmNoYXJhY3RlcihsdXRfZGYkVHdpbl9wYWlycykNCm5hbWVzKGx1dCkgPC0gbHV0X2RmJFNhbXBsZQ0KDQojIEFkZCBpbiB0aGUgc2hvcnQgbmFtZXMgdG8gdGhlIGRpc3RhbmNlIGRhdGEgZnJhbWVzDQp1bndlaWdodGVkRGlzdERGJFZhcjFfU2hvcnROYW1lIDwtIGx1dFt1bndlaWdodGVkRGlzdERGJFZhcjFdDQp1bndlaWdodGVkRGlzdERGJFZhcjJfU2hvcnROYW1lIDwtIGx1dFt1bndlaWdodGVkRGlzdERGJFZhcjJdDQoNCiMgQWRkIGEgY29sdW1uIGluZGljYXRpbmcgd2hldGhlciBhIGdpdmVuIHJvdyAocGFpcndpc2UgY29tcGFyaXNvbikgaXMgYmV0d2Vlbg0KIyAgIHR3byByZWxhdGVkIG9yIHVucmVsYXRlZCBzYW1wbGVzLg0KIyAgIExvb3Agb3ZlciB0aGUgcm93cyBvZiB0aGUgZGlzdGFuY2UgZGYsIHNwbGl0IFZhcjEgYW5kIFZhcjIgc2hvcnQgbmFtZXMgYnkgDQojICAgIi4iIGRlbGltaXRlciBhbmQgY29tcGFyZSB0aGUgMm5kIGVsZW1lbnQgb2YgdGhlIHJlc3VsdGluZyBsaXN0IHdoaWNoIHdpbGwgaG9sZCB0aGUgDQojICAgVGFyciBGYW1pbHkgSUQsDQoNCkFkZFBhaXJSZWxhdGlvbiA8LSBmdW5jdGlvbihkZikgew0KICANCiAgb2xkREYgPC0gZGYNCiAgDQogIHBhaXJSZWxhdGlvbiA8LSB2ZWN0b3IobW9kZSA9ICJjaGFyYWN0ZXIiLCBsZW5ndGggPSBucm93KG9sZERGKSkNCiAgDQogIGZvciAoaSBpbiAxOm5yb3cob2xkREYpKSB7DQogICAgVmFyMV9zcGxpdCA8LSBzdHJzcGxpdCh4ID0gZGZbaSwgIlZhcjFfU2hvcnROYW1lIl0sIHNwbGl0ID0gIlxcLiIpDQogICAgVmFyMl9zcGxpdCA8LSBzdHJzcGxpdCh4ID0gZGZbaSwgIlZhcjJfU2hvcnROYW1lIl0sIHNwbGl0ID0gIlxcLiIpDQogICAgDQogICAgaWYgKFZhcjFfc3BsaXRbWzFdXVtbMV1dID09IFZhcjJfc3BsaXRbWzFdXVtbMV1dKSB7DQogICAgICBwYWlyUmVsYXRpb25baV0gPC0gIkJldHdlZW4gXG4gdHdpbnMiDQogICAgfSBlbHNlIHsNCiAgICAgIHBhaXJSZWxhdGlvbltpXSA8LSAiQmV0d2VlbiBcbiB1bnJlbGF0ZWQiDQogICAgfQ0KICB9DQogIA0KICBvbGRERiRQYWlyX1JlbGF0aW9uIDwtIHBhaXJSZWxhdGlvbg0KICANCiAgcmV0dXJuKG9sZERGKQ0KICANCn0NCg0KdW53ZWlnaHRlZERpc3RERiA8LSBBZGRQYWlyUmVsYXRpb24odW53ZWlnaHRlZERpc3RERikNCg0KI1dlaWdodGVkIGRpc3RhbmNlIGJveHBsb3RzDQoNCm15X2NvbXBhcmlzb25zIDwtIGxpc3QoYygiUmVsYXRlZCIsIlVucmVsYXRlZCIpKQ0KDQpCcmF5UGxvdC52aXIuMCA8LSANCiAgDQogIGdncGxvdCh1bndlaWdodGVkRGlzdERGLGFlcyhQYWlyX1JlbGF0aW9uLFVuaUZyYWNfRGlzdGFuY2UsZmlsbCA9IFBhaXJfUmVsYXRpb24pKSArDQogIGdlb21fYm94cGxvdChhZXMoZmlsbCA9IFBhaXJfUmVsYXRpb24pLG91dGxpZXIuc2hhcGU9TkEpKw0KICAjICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMikgKw0KICB5bGFiKCJCcmF5LUN1cnRpcyBkaXNzaW1pbGFyaXR5IikgKw0KICB4bGFiKCJEYXkgMSIpICsNCiAgdGhlbWVfcHViY2xlYW4oKSArDQogIHNjYWxlX2ZpbGxfamNvKCkgKw0KICBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gIndpbGNveC50ZXN0IiAsYWVzKGxhYmVsID0gcGFzdGUwKCJwID0gIiwgLi5wLmZvcm1hdC4uKSksbGFiZWwueC5ucGM9ImNlbnRlciIsbGFiZWwueT0wLjQ1KSArDQogIGd1aWRlcyhmaWxsPSJub25lIikNCg0KDQojQnJheVBsb3QudmlyDQoNCnBsb3RfZ3JpZChCcmF5UGxvdC5iYWMuMCxCcmF5UGxvdC52aXIuMCwgbnJvdyA9IDEpDQpgYGANCg0KIyMjIERheSAxNQ0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgbWVzc2FnZSA9IEYsIHdhcm5pbmcgPSAgRiwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTQsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQ0Kc291cmNlKCJIZWxwZXJfRnVuY3Rpb25zLlIiKQ0KDQpQU0IuQ1NTLnN1YiA8LSBzdWJzZXRfc2FtcGxlcyhQU0IuQ1NTLCBEYXlzID09ICIxNSIpIA0KDQpQU1YuQ1NTLnN1YiA8LSBzdWJzZXRfc2FtcGxlcyhQU1YuQ1NTLCBEYXlzID09ICIxNSIpIA0KDQojIyMjIyMjIyMjIyMjR2VuZXJhdGUgQnJheSBjdXJ0aXMgcGFpcndpc2UgZGlzdGFuY2UgZGF0YSBmcmFtZToNCg0KIyBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIG9iamVjdA0KbWV0YWRhdGFTdG9vbCA8LSBkYXRhLmZyYW1lKHNhbXBsZV9kYXRhKFBTQi5DU1Muc3ViKSkNCg0KdW53ZWlnaHRlZERpc3QgPC0gYXMubWF0cml4KHQoUFNCLkNTUy5zdWJAb3R1X3RhYmxlKSkNCg0KdW53ZWlnaHRlZERpc3QgPC0gdmVnZGlzdCh1bndlaWdodGVkRGlzdCwgZGlzdCA9ICJicmF5IikNCg0KIyBDb2VyY2UgZGlzdGFuY2Ugb2JqZWN0IGludG8gbWF0cml4DQp1bndlaWdodGVkRGlzdE10eCA8LSBhcy5tYXRyaXgodW53ZWlnaHRlZERpc3QpDQoNCiMgTWVsdCBhbmQgcmVtb3ZlIHZhbHVlcyBvZiAwIHRvIGVsaW1pbmF0ZSBkaXN0YW5jZXMgb2YgZWFjaCBzYW1wbGUgdG8gaXRzZWxmDQp1bndlaWdodGVkRGlzdE10eF9tZWx0IDwtIHN1YnNldChyZXNoYXBlMjo6bWVsdCh1bndlaWdodGVkRGlzdE10eCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5uYW1lID0gIlVuaUZyYWNfRGlzdGFuY2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaUZyYWNfRGlzdGFuY2UgIT0gMCkNCg0KIyBDaGFuZ2UgVmFyMSBhbmQgVmFyMiBmcm9tIGZhY3RvcnMgdG8gY2hhcmFjdGVycyBmb3IgZWFzaWVyIHVzZSB3aXRoIGRwbHlyDQpmYWN0b3JDb2xzIDwtIGMoIlZhcjEiLCAiVmFyMiIpDQp1bndlaWdodGVkRGlzdE10eF9tZWx0W2ZhY3RvckNvbHNdIDwtIGxhcHBseSh1bndlaWdodGVkRGlzdE10eF9tZWx0W2ZhY3RvckNvbHNdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3RlcikNCg0KIyBBZGQgY29sdW1ucyBmb3IgbGF0ZXIgc3Vic2V0dGluZyB3aGVuIHBsb3R0aW5nLiAgVGhpcyBpbmZvcm1hdGlvbiB3aWxsIGdldA0KIyAgIHB1bGxlZCBmcm9tIHRoZSBtZXRhZGF0YSAobWV0YWRhdGFTdG9vbCkuICBXaXRoaW4gdGhlICpEaXN0TXR4X21lbHQgZGF0YSANCiMgICBmcmFtZXMsIHdlIG5lZWQgYSBjb2x1bW4gaW5kaWNhdGluZyB3aGV0aGVyIFZhcjEgYW5kIFZhcjIgYXJlIGluZmFudHMsDQojICAgbW90aGVycywgYW5kIHdoZXRoZXIgdGhleSdyZSByZWxhdGVkLg0KdW53ZWlnaHRlZERpc3RERiA8LSB1bndlaWdodGVkRGlzdE10eF9tZWx0DQoNCiMgQWRkIFZhcjEgYW5kIFZhcjIgVHlwZSBhbmQgWnlnb3NpdHkgY29sdW1ucw0KIyBQdXQgcm93bmFtZXMgYmFjayBpbiBtZXRhZGF0YVN0b29sLCB0aGVuIHVzZSB0aGUgcm93bmFtZXMgdG8gbG9jYXRlIG5lZWRlZCBpbmZvDQojIDwtIGNvbHVtbl90b19yb3duYW1lcyhtZXRhZGF0YVN0b29sLCB2YXIgPSAiVHdpbl9wYWlycyIpDQoNCnVud2VpZ2h0ZWREaXN0REYgPC0gdW53ZWlnaHRlZERpc3RERiAlPiUNCiAgbXV0YXRlKFZhcjFfVHlwZSA9IG1ldGFkYXRhU3Rvb2xbdW53ZWlnaHRlZERpc3RERiRWYXIxLCAiVHdpbl9wYWlycyJdLA0KICAgICAgICAgVmFyMl9UeXBlID0gbWV0YWRhdGFTdG9vbFt1bndlaWdodGVkRGlzdERGJFZhcjIsICJUd2luX3BhaXJzIl0pDQoNCiMgVG8gZWFzaWx5IGRldGVybWluZSB0aGUgcmVsYXRlZG5lc3Mgb2YgdGhlIHBhaXJlZCBzYW1wbGVzIGluIGVhY2ggcm93LA0KIyAgIGNyZWF0ZSAic2hvcnQgbmFtZXMiIHRvIHJlcGxhY2UgdGhlIGxvbmcgc2FtcGxlIG5hbWVzLg0KIyAgIEZpcnN0IHB1dCB0aGUgcm93bmFtZXMgYmFjayBpbnRvIGEgY29sdW1uLg0KDQptZXRhZGF0YVN0b29sIDwtIHJvd25hbWVzX3RvX2NvbHVtbihtZXRhZGF0YVN0b29sLCB2YXIgPSAiU2FtcGxlIikNCg0KbHV0X2RmIDwtIGRwbHlyOjpzZWxlY3QobWV0YWRhdGFTdG9vbCwgU2FtcGxlLCBUd2luX3BhaXJzLCBUd2luX3BhaXJzKQ0KDQojIGNvbnZlcnQgbHV0X2RmIGludG8gYSB2ZWN0b3INCmx1dCA8LSBhcy5jaGFyYWN0ZXIobHV0X2RmJFR3aW5fcGFpcnMpDQpuYW1lcyhsdXQpIDwtIGx1dF9kZiRTYW1wbGUNCg0KIyBBZGQgaW4gdGhlIHNob3J0IG5hbWVzIHRvIHRoZSBkaXN0YW5jZSBkYXRhIGZyYW1lcw0KdW53ZWlnaHRlZERpc3RERiRWYXIxX1Nob3J0TmFtZSA8LSBsdXRbdW53ZWlnaHRlZERpc3RERiRWYXIxXQ0KdW53ZWlnaHRlZERpc3RERiRWYXIyX1Nob3J0TmFtZSA8LSBsdXRbdW53ZWlnaHRlZERpc3RERiRWYXIyXQ0KDQojIEFkZCBhIGNvbHVtbiBpbmRpY2F0aW5nIHdoZXRoZXIgYSBnaXZlbiByb3cgKHBhaXJ3aXNlIGNvbXBhcmlzb24pIGlzIGJldHdlZW4NCiMgICB0d28gcmVsYXRlZCBvciB1bnJlbGF0ZWQgc2FtcGxlcy4NCiMgICBMb29wIG92ZXIgdGhlIHJvd3Mgb2YgdGhlIGRpc3RhbmNlIGRmLCBzcGxpdCBWYXIxIGFuZCBWYXIyIHNob3J0IG5hbWVzIGJ5IA0KIyAgICIuIiBkZWxpbWl0ZXIgYW5kIGNvbXBhcmUgdGhlIDJuZCBlbGVtZW50IG9mIHRoZSByZXN1bHRpbmcgbGlzdCB3aGljaCB3aWxsIGhvbGQgdGhlIA0KIyAgIFRhcnIgRmFtaWx5IElELA0KDQpBZGRQYWlyUmVsYXRpb24gPC0gZnVuY3Rpb24oZGYpIHsNCiAgDQogIG9sZERGIDwtIGRmDQogIA0KICBwYWlyUmVsYXRpb24gPC0gdmVjdG9yKG1vZGUgPSAiY2hhcmFjdGVyIiwgbGVuZ3RoID0gbnJvdyhvbGRERikpDQogIA0KICBmb3IgKGkgaW4gMTpucm93KG9sZERGKSkgew0KICAgIFZhcjFfc3BsaXQgPC0gc3Ryc3BsaXQoeCA9IGRmW2ksICJWYXIxX1Nob3J0TmFtZSJdLCBzcGxpdCA9ICJcXC4iKQ0KICAgIFZhcjJfc3BsaXQgPC0gc3Ryc3BsaXQoeCA9IGRmW2ksICJWYXIyX1Nob3J0TmFtZSJdLCBzcGxpdCA9ICJcXC4iKQ0KICAgIA0KICAgIGlmIChWYXIxX3NwbGl0W1sxXV1bWzFdXSA9PSBWYXIyX3NwbGl0W1sxXV1bWzFdXSkgew0KICAgICAgcGFpclJlbGF0aW9uW2ldIDwtICJCZXR3ZWVuIFxuIHR3aW5zIg0KICAgIH0gZWxzZSB7DQogICAgICBwYWlyUmVsYXRpb25baV0gPC0gIkJldHdlZW4gXG4gdW5yZWxhdGVkIg0KICAgIH0NCiAgfQ0KICANCiAgb2xkREYkUGFpcl9SZWxhdGlvbiA8LSBwYWlyUmVsYXRpb24NCiAgDQogIHJldHVybihvbGRERikNCiAgDQp9DQoNCnVud2VpZ2h0ZWREaXN0REYgPC0gQWRkUGFpclJlbGF0aW9uKHVud2VpZ2h0ZWREaXN0REYpDQoNCiNXZWlnaHRlZCBkaXN0YW5jZSBib3hwbG90cw0KDQpCcmF5UGxvdC5iYWMuMTUgPC0gDQogIA0KICBnZ3Bsb3QodW53ZWlnaHRlZERpc3RERixhZXMoUGFpcl9SZWxhdGlvbixVbmlGcmFjX0Rpc3RhbmNlLGZpbGwgPSBQYWlyX1JlbGF0aW9uKSkgKw0KICBnZW9tX2JveHBsb3QoYWVzKGZpbGwgPSBQYWlyX1JlbGF0aW9uKSxvdXRsaWVyLnNoYXBlPU5BKSsNCiAgIyAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIpICsNCiAgeWxhYigiQnJheS1DdXJ0aXMgZGlzc2ltaWxhcml0eSIpICsNCiAgeGxhYigiRGF5IDE1IikgKw0KICB0aGVtZV9wdWJjbGVhbigpICsNCiAgc2NhbGVfZmlsbF9qY28oKSArDQogIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAid2lsY294LnRlc3QiICxhZXMobGFiZWwgPSBwYXN0ZTAoInAgPSAiLCAuLnAuZm9ybWF0Li4pKSxsYWJlbC54Lm5wYz0iY2VudGVyIixsYWJlbC55PTAuNTgpICsNCiAgZ3VpZGVzKGZpbGw9Im5vbmUiKSArDQogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkNCiAgDQoNCiNCcmF5UGxvdC5iYWMNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNWaXJvbWUNCg0KIyMjIyMjIyMjIyMjI0dlbmVyYXRlIEJyYXkgY3VydGlzIHBhaXJ3aXNlIGRpc3RhbmNlIGRhdGEgZnJhbWU6DQoNCiMgQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBvYmplY3QNCm1ldGFkYXRhU3Rvb2wgPC0gZGF0YS5mcmFtZShzYW1wbGVfZGF0YShQU1YuQ1NTLnN1YikpDQoNCnVud2VpZ2h0ZWREaXN0IDwtIGFzLm1hdHJpeCh0KFBTVi5DU1Muc3ViQG90dV90YWJsZSkpDQoNCnVud2VpZ2h0ZWREaXN0IDwtIHZlZ2Rpc3QodW53ZWlnaHRlZERpc3QsIGRpc3QgPSAiYnJheSIpDQoNCiMgQ29lcmNlIGRpc3RhbmNlIG9iamVjdCBpbnRvIG1hdHJpeA0KdW53ZWlnaHRlZERpc3RNdHggPC0gYXMubWF0cml4KHVud2VpZ2h0ZWREaXN0KQ0KDQojIE1lbHQgYW5kIHJlbW92ZSB2YWx1ZXMgb2YgMCB0byBlbGltaW5hdGUgZGlzdGFuY2VzIG9mIGVhY2ggc2FtcGxlIHRvIGl0c2VsZg0KdW53ZWlnaHRlZERpc3RNdHhfbWVsdCA8LSBzdWJzZXQocmVzaGFwZTI6Om1lbHQodW53ZWlnaHRlZERpc3RNdHgsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICJVbmlGcmFjX0Rpc3RhbmNlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmlGcmFjX0Rpc3RhbmNlICE9IDApDQoNCiMgQ2hhbmdlIFZhcjEgYW5kIFZhcjIgZnJvbSBmYWN0b3JzIHRvIGNoYXJhY3RlcnMgZm9yIGVhc2llciB1c2Ugd2l0aCBkcGx5cg0KZmFjdG9yQ29scyA8LSBjKCJWYXIxIiwgIlZhcjIiKQ0KdW53ZWlnaHRlZERpc3RNdHhfbWVsdFtmYWN0b3JDb2xzXSA8LSBsYXBwbHkodW53ZWlnaHRlZERpc3RNdHhfbWVsdFtmYWN0b3JDb2xzXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIpDQoNCiMgQWRkIGNvbHVtbnMgZm9yIGxhdGVyIHN1YnNldHRpbmcgd2hlbiBwbG90dGluZy4gIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBnZXQNCiMgICBwdWxsZWQgZnJvbSB0aGUgbWV0YWRhdGEgKG1ldGFkYXRhU3Rvb2wpLiAgV2l0aGluIHRoZSAqRGlzdE10eF9tZWx0IGRhdGEgDQojICAgZnJhbWVzLCB3ZSBuZWVkIGEgY29sdW1uIGluZGljYXRpbmcgd2hldGhlciBWYXIxIGFuZCBWYXIyIGFyZSBpbmZhbnRzLA0KIyAgIG1vdGhlcnMsIGFuZCB3aGV0aGVyIHRoZXkncmUgcmVsYXRlZC4NCnVud2VpZ2h0ZWREaXN0REYgPC0gdW53ZWlnaHRlZERpc3RNdHhfbWVsdA0KDQojIEFkZCBWYXIxIGFuZCBWYXIyIFR5cGUgYW5kIFp5Z29zaXR5IGNvbHVtbnMNCiMgUHV0IHJvd25hbWVzIGJhY2sgaW4gbWV0YWRhdGFTdG9vbCwgdGhlbiB1c2UgdGhlIHJvd25hbWVzIHRvIGxvY2F0ZSBuZWVkZWQgaW5mbw0KIyA8LSBjb2x1bW5fdG9fcm93bmFtZXMobWV0YWRhdGFTdG9vbCwgdmFyID0gIlR3aW5fcGFpcnMiKQ0KDQp1bndlaWdodGVkRGlzdERGIDwtIHVud2VpZ2h0ZWREaXN0REYgJT4lDQogIG11dGF0ZShWYXIxX1R5cGUgPSBtZXRhZGF0YVN0b29sW3Vud2VpZ2h0ZWREaXN0REYkVmFyMSwgIlR3aW5fcGFpcnMiXSwNCiAgICAgICAgIFZhcjJfVHlwZSA9IG1ldGFkYXRhU3Rvb2xbdW53ZWlnaHRlZERpc3RERiRWYXIyLCAiVHdpbl9wYWlycyJdKQ0KDQojIFRvIGVhc2lseSBkZXRlcm1pbmUgdGhlIHJlbGF0ZWRuZXNzIG9mIHRoZSBwYWlyZWQgc2FtcGxlcyBpbiBlYWNoIHJvdywNCiMgICBjcmVhdGUgInNob3J0IG5hbWVzIiB0byByZXBsYWNlIHRoZSBsb25nIHNhbXBsZSBuYW1lcy4NCiMgICBGaXJzdCBwdXQgdGhlIHJvd25hbWVzIGJhY2sgaW50byBhIGNvbHVtbi4NCg0KbWV0YWRhdGFTdG9vbCA8LSByb3duYW1lc190b19jb2x1bW4obWV0YWRhdGFTdG9vbCwgdmFyID0gIlNhbXBsZSIpDQoNCmx1dF9kZiA8LSBkcGx5cjo6c2VsZWN0KG1ldGFkYXRhU3Rvb2wsIFNhbXBsZSwgVHdpbl9wYWlycywgVHdpbl9wYWlycykNCg0KIyBjb252ZXJ0IGx1dF9kZiBpbnRvIGEgdmVjdG9yDQpsdXQgPC0gYXMuY2hhcmFjdGVyKGx1dF9kZiRUd2luX3BhaXJzKQ0KbmFtZXMobHV0KSA8LSBsdXRfZGYkU2FtcGxlDQoNCiMgQWRkIGluIHRoZSBzaG9ydCBuYW1lcyB0byB0aGUgZGlzdGFuY2UgZGF0YSBmcmFtZXMNCnVud2VpZ2h0ZWREaXN0REYkVmFyMV9TaG9ydE5hbWUgPC0gbHV0W3Vud2VpZ2h0ZWREaXN0REYkVmFyMV0NCnVud2VpZ2h0ZWREaXN0REYkVmFyMl9TaG9ydE5hbWUgPC0gbHV0W3Vud2VpZ2h0ZWREaXN0REYkVmFyMl0NCg0KIyBBZGQgYSBjb2x1bW4gaW5kaWNhdGluZyB3aGV0aGVyIGEgZ2l2ZW4gcm93IChwYWlyd2lzZSBjb21wYXJpc29uKSBpcyBiZXR3ZWVuDQojICAgdHdvIHJlbGF0ZWQgb3IgdW5yZWxhdGVkIHNhbXBsZXMuDQojICAgTG9vcCBvdmVyIHRoZSByb3dzIG9mIHRoZSBkaXN0YW5jZSBkZiwgc3BsaXQgVmFyMSBhbmQgVmFyMiBzaG9ydCBuYW1lcyBieSANCiMgICAiLiIgZGVsaW1pdGVyIGFuZCBjb21wYXJlIHRoZSAybmQgZWxlbWVudCBvZiB0aGUgcmVzdWx0aW5nIGxpc3Qgd2hpY2ggd2lsbCBob2xkIHRoZSANCiMgICBUYXJyIEZhbWlseSBJRCwNCg0KQWRkUGFpclJlbGF0aW9uIDwtIGZ1bmN0aW9uKGRmKSB7DQogIA0KICBvbGRERiA8LSBkZg0KICANCiAgcGFpclJlbGF0aW9uIDwtIHZlY3Rvcihtb2RlID0gImNoYXJhY3RlciIsIGxlbmd0aCA9IG5yb3cob2xkREYpKQ0KICANCiAgZm9yIChpIGluIDE6bnJvdyhvbGRERikpIHsNCiAgICBWYXIxX3NwbGl0IDwtIHN0cnNwbGl0KHggPSBkZltpLCAiVmFyMV9TaG9ydE5hbWUiXSwgc3BsaXQgPSAiXFwuIikNCiAgICBWYXIyX3NwbGl0IDwtIHN0cnNwbGl0KHggPSBkZltpLCAiVmFyMl9TaG9ydE5hbWUiXSwgc3BsaXQgPSAiXFwuIikNCiAgICANCiAgICBpZiAoVmFyMV9zcGxpdFtbMV1dW1sxXV0gPT0gVmFyMl9zcGxpdFtbMV1dW1sxXV0pIHsNCiAgICAgIHBhaXJSZWxhdGlvbltpXSA8LSAiQmV0d2VlbiBcbiB0d2lucyINCiAgICB9IGVsc2Ugew0KICAgICAgcGFpclJlbGF0aW9uW2ldIDwtICJCZXR3ZWVuIFxuIHVucmVsYXRlZCINCiAgICB9DQogIH0NCiAgDQogIG9sZERGJFBhaXJfUmVsYXRpb24gPC0gcGFpclJlbGF0aW9uDQogIA0KICByZXR1cm4ob2xkREYpDQogIA0KfQ0KDQp1bndlaWdodGVkRGlzdERGIDwtIEFkZFBhaXJSZWxhdGlvbih1bndlaWdodGVkRGlzdERGKQ0KDQojV2VpZ2h0ZWQgZGlzdGFuY2UgYm94cGxvdHMNCg0KQnJheVBsb3QudmlyLjE1IDwtIA0KICANCiAgZ2dwbG90KHVud2VpZ2h0ZWREaXN0REYsYWVzKFBhaXJfUmVsYXRpb24sVW5pRnJhY19EaXN0YW5jZSxmaWxsID0gUGFpcl9SZWxhdGlvbikpICsNCiAgZ2VvbV9ib3hwbG90KGFlcyhmaWxsID0gUGFpcl9SZWxhdGlvbiksb3V0bGllci5zaGFwZT1OQSkrDQogICMgIGdlb21faml0dGVyKHdpZHRoID0gMC4yKSArDQogIHlsYWIoIkJyYXktQ3VydGlzIGRpc3NpbWlsYXJpdHkiKSArDQogIHhsYWIoIkRheSAxNSIpICsNCiAgdGhlbWVfcHViY2xlYW4oKSArDQogIHNjYWxlX2ZpbGxfamNvKCkgKw0KICBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gIndpbGNveC50ZXN0IiAsYWVzKGxhYmVsID0gcGFzdGUwKCJwID0gIiwgLi5wLmZvcm1hdC4uKSksbGFiZWwueC5ucGM9ImNlbnRlciIsbGFiZWwueT0wLjYpICsNCiAgZ3VpZGVzKGZpbGw9Im5vbmUiKSArDQogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkNCg0KI0JyYXlQbG90LnZpcg0KDQpwbG90X2dyaWQoQnJheVBsb3QuYmFjLjE1LEJyYXlQbG90LnZpci4xNSwgbnJvdyA9IDEpICsNCiAgZ3VpZGVzKGZpbGw9Im5vbmUiKQ0KYGBgDQoNCiMjIyBEYXkgMzANCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gIEYsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD00LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0NCnNvdXJjZSgiSGVscGVyX0Z1bmN0aW9ucy5SIikNCg0KUFNCLkNTUy5zdWIgPC0gc3Vic2V0X3NhbXBsZXMoUFNCLkNTUywgRGF5cyA9PSAiMzAiKSANCg0KUFNWLkNTUy5zdWIgPC0gc3Vic2V0X3NhbXBsZXMoUFNWLkNTUywgRGF5cyA9PSAiMzAiKSANCg0KIyMjIyMjIyMjIyMjI0dlbmVyYXRlIEJyYXkgY3VydGlzIHBhaXJ3aXNlIGRpc3RhbmNlIGRhdGEgZnJhbWU6DQoNCiMgQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBvYmplY3QNCm1ldGFkYXRhU3Rvb2wgPC0gZGF0YS5mcmFtZShzYW1wbGVfZGF0YShQU0IuQ1NTLnN1YikpDQoNCnVud2VpZ2h0ZWREaXN0IDwtIGFzLm1hdHJpeCh0KFBTQi5DU1Muc3ViQG90dV90YWJsZSkpDQoNCnVud2VpZ2h0ZWREaXN0IDwtIHZlZ2Rpc3QodW53ZWlnaHRlZERpc3QsIGRpc3QgPSAiYnJheSIpDQoNCiMgQ29lcmNlIGRpc3RhbmNlIG9iamVjdCBpbnRvIG1hdHJpeA0KdW53ZWlnaHRlZERpc3RNdHggPC0gYXMubWF0cml4KHVud2VpZ2h0ZWREaXN0KQ0KDQojIE1lbHQgYW5kIHJlbW92ZSB2YWx1ZXMgb2YgMCB0byBlbGltaW5hdGUgZGlzdGFuY2VzIG9mIGVhY2ggc2FtcGxlIHRvIGl0c2VsZg0KdW53ZWlnaHRlZERpc3RNdHhfbWVsdCA8LSBzdWJzZXQocmVzaGFwZTI6Om1lbHQodW53ZWlnaHRlZERpc3RNdHgsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICJVbmlGcmFjX0Rpc3RhbmNlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmlGcmFjX0Rpc3RhbmNlICE9IDApDQoNCiMgQ2hhbmdlIFZhcjEgYW5kIFZhcjIgZnJvbSBmYWN0b3JzIHRvIGNoYXJhY3RlcnMgZm9yIGVhc2llciB1c2Ugd2l0aCBkcGx5cg0KZmFjdG9yQ29scyA8LSBjKCJWYXIxIiwgIlZhcjIiKQ0KdW53ZWlnaHRlZERpc3RNdHhfbWVsdFtmYWN0b3JDb2xzXSA8LSBsYXBwbHkodW53ZWlnaHRlZERpc3RNdHhfbWVsdFtmYWN0b3JDb2xzXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIpDQoNCiMgQWRkIGNvbHVtbnMgZm9yIGxhdGVyIHN1YnNldHRpbmcgd2hlbiBwbG90dGluZy4gIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBnZXQNCiMgICBwdWxsZWQgZnJvbSB0aGUgbWV0YWRhdGEgKG1ldGFkYXRhU3Rvb2wpLiAgV2l0aGluIHRoZSAqRGlzdE10eF9tZWx0IGRhdGEgDQojICAgZnJhbWVzLCB3ZSBuZWVkIGEgY29sdW1uIGluZGljYXRpbmcgd2hldGhlciBWYXIxIGFuZCBWYXIyIGFyZSBpbmZhbnRzLA0KIyAgIG1vdGhlcnMsIGFuZCB3aGV0aGVyIHRoZXkncmUgcmVsYXRlZC4NCnVud2VpZ2h0ZWREaXN0REYgPC0gdW53ZWlnaHRlZERpc3RNdHhfbWVsdA0KDQojIEFkZCBWYXIxIGFuZCBWYXIyIFR5cGUgYW5kIFp5Z29zaXR5IGNvbHVtbnMNCiMgUHV0IHJvd25hbWVzIGJhY2sgaW4gbWV0YWRhdGFTdG9vbCwgdGhlbiB1c2UgdGhlIHJvd25hbWVzIHRvIGxvY2F0ZSBuZWVkZWQgaW5mbw0KIyA8LSBjb2x1bW5fdG9fcm93bmFtZXMobWV0YWRhdGFTdG9vbCwgdmFyID0gIlR3aW5fcGFpcnMiKQ0KDQp1bndlaWdodGVkRGlzdERGIDwtIHVud2VpZ2h0ZWREaXN0REYgJT4lDQogIG11dGF0ZShWYXIxX1R5cGUgPSBtZXRhZGF0YVN0b29sW3Vud2VpZ2h0ZWREaXN0REYkVmFyMSwgIlR3aW5fcGFpcnMiXSwNCiAgICAgICAgIFZhcjJfVHlwZSA9IG1ldGFkYXRhU3Rvb2xbdW53ZWlnaHRlZERpc3RERiRWYXIyLCAiVHdpbl9wYWlycyJdKQ0KDQojIFRvIGVhc2lseSBkZXRlcm1pbmUgdGhlIHJlbGF0ZWRuZXNzIG9mIHRoZSBwYWlyZWQgc2FtcGxlcyBpbiBlYWNoIHJvdywNCiMgICBjcmVhdGUgInNob3J0IG5hbWVzIiB0byByZXBsYWNlIHRoZSBsb25nIHNhbXBsZSBuYW1lcy4NCiMgICBGaXJzdCBwdXQgdGhlIHJvd25hbWVzIGJhY2sgaW50byBhIGNvbHVtbi4NCg0KbWV0YWRhdGFTdG9vbCA8LSByb3duYW1lc190b19jb2x1bW4obWV0YWRhdGFTdG9vbCwgdmFyID0gIlNhbXBsZSIpDQoNCmx1dF9kZiA8LSBkcGx5cjo6c2VsZWN0KG1ldGFkYXRhU3Rvb2wsIFNhbXBsZSwgVHdpbl9wYWlycywgVHdpbl9wYWlycykNCg0KIyBjb252ZXJ0IGx1dF9kZiBpbnRvIGEgdmVjdG9yDQpsdXQgPC0gYXMuY2hhcmFjdGVyKGx1dF9kZiRUd2luX3BhaXJzKQ0KbmFtZXMobHV0KSA8LSBsdXRfZGYkU2FtcGxlDQoNCiMgQWRkIGluIHRoZSBzaG9ydCBuYW1lcyB0byB0aGUgZGlzdGFuY2UgZGF0YSBmcmFtZXMNCnVud2VpZ2h0ZWREaXN0REYkVmFyMV9TaG9ydE5hbWUgPC0gbHV0W3Vud2VpZ2h0ZWREaXN0REYkVmFyMV0NCnVud2VpZ2h0ZWREaXN0REYkVmFyMl9TaG9ydE5hbWUgPC0gbHV0W3Vud2VpZ2h0ZWREaXN0REYkVmFyMl0NCg0KIyBBZGQgYSBjb2x1bW4gaW5kaWNhdGluZyB3aGV0aGVyIGEgZ2l2ZW4gcm93IChwYWlyd2lzZSBjb21wYXJpc29uKSBpcyBiZXR3ZWVuDQojICAgdHdvIHJlbGF0ZWQgb3IgdW5yZWxhdGVkIHNhbXBsZXMuDQojICAgTG9vcCBvdmVyIHRoZSByb3dzIG9mIHRoZSBkaXN0YW5jZSBkZiwgc3BsaXQgVmFyMSBhbmQgVmFyMiBzaG9ydCBuYW1lcyBieSANCiMgICAiLiIgZGVsaW1pdGVyIGFuZCBjb21wYXJlIHRoZSAybmQgZWxlbWVudCBvZiB0aGUgcmVzdWx0aW5nIGxpc3Qgd2hpY2ggd2lsbCBob2xkIHRoZSANCiMgICBUYXJyIEZhbWlseSBJRCwNCg0KQWRkUGFpclJlbGF0aW9uIDwtIGZ1bmN0aW9uKGRmKSB7DQogIA0KICBvbGRERiA8LSBkZg0KICANCiAgcGFpclJlbGF0aW9uIDwtIHZlY3Rvcihtb2RlID0gImNoYXJhY3RlciIsIGxlbmd0aCA9IG5yb3cob2xkREYpKQ0KICANCiAgZm9yIChpIGluIDE6bnJvdyhvbGRERikpIHsNCiAgICBWYXIxX3NwbGl0IDwtIHN0cnNwbGl0KHggPSBkZltpLCAiVmFyMV9TaG9ydE5hbWUiXSwgc3BsaXQgPSAiXFwuIikNCiAgICBWYXIyX3NwbGl0IDwtIHN0cnNwbGl0KHggPSBkZltpLCAiVmFyMl9TaG9ydE5hbWUiXSwgc3BsaXQgPSAiXFwuIikNCiAgICANCiAgICBpZiAoVmFyMV9zcGxpdFtbMV1dW1sxXV0gPT0gVmFyMl9zcGxpdFtbMV1dW1sxXV0pIHsNCiAgICAgIHBhaXJSZWxhdGlvbltpXSA8LSAiQmV0d2VlbiBcbiB0d2lucyINCiAgICB9IGVsc2Ugew0KICAgICAgcGFpclJlbGF0aW9uW2ldIDwtICJCZXR3ZWVuIFxuIHVucmVsYXRlZCINCiAgICB9DQogIH0NCiAgDQogIG9sZERGJFBhaXJfUmVsYXRpb24gPC0gcGFpclJlbGF0aW9uDQogIA0KICByZXR1cm4ob2xkREYpDQogIA0KfQ0KDQp1bndlaWdodGVkRGlzdERGIDwtIEFkZFBhaXJSZWxhdGlvbih1bndlaWdodGVkRGlzdERGKQ0KDQojV2VpZ2h0ZWQgZGlzdGFuY2UgYm94cGxvdHMNCg0KQnJheVBsb3QuYmFjLjMwIDwtIA0KICANCiAgZ2dwbG90KHVud2VpZ2h0ZWREaXN0REYsYWVzKFBhaXJfUmVsYXRpb24sVW5pRnJhY19EaXN0YW5jZSxmaWxsID0gUGFpcl9SZWxhdGlvbikpICsNCiAgZ2VvbV9ib3hwbG90KGFlcyhmaWxsID0gUGFpcl9SZWxhdGlvbiksb3V0bGllci5zaGFwZT1OQSkrDQogICMgIGdlb21faml0dGVyKHdpZHRoID0gMC4yKSArDQogIHlsYWIoIkJyYXktQ3VydGlzIGRpc3NpbWlsYXJpdHkiKSArDQogIHhsYWIoIkRheSAzMCIpICsNCiAgdGhlbWVfcHViY2xlYW4oKSArDQogIHNjYWxlX2ZpbGxfamNvKCkgKw0KICBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gIndpbGNveC50ZXN0IiAsYWVzKGxhYmVsID0gcGFzdGUwKCJwID0gIiwgLi5wLmZvcm1hdC4uKSksbGFiZWwueC5ucGM9ImNlbnRlciIsbGFiZWwueT0wLjUwKSArDQogIGd1aWRlcyhmaWxsPSJub25lIikgKw0KICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpDQoNCiNCcmF5UGxvdC5iYWMNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNWaXJvbWUNCg0KIyMjIyMjIyMjIyMjI0dlbmVyYXRlIEJyYXkgY3VydGlzIHBhaXJ3aXNlIGRpc3RhbmNlIGRhdGEgZnJhbWU6DQoNCiMgQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBvYmplY3QNCm1ldGFkYXRhU3Rvb2wgPC0gZGF0YS5mcmFtZShzYW1wbGVfZGF0YShQU1YuQ1NTLnN1YikpDQoNCnVud2VpZ2h0ZWREaXN0IDwtIGFzLm1hdHJpeCh0KFBTVi5DU1Muc3ViQG90dV90YWJsZSkpDQoNCnVud2VpZ2h0ZWREaXN0IDwtIHZlZ2Rpc3QodW53ZWlnaHRlZERpc3QsIGRpc3QgPSAiYnJheSIpDQoNCiMgQ29lcmNlIGRpc3RhbmNlIG9iamVjdCBpbnRvIG1hdHJpeA0KdW53ZWlnaHRlZERpc3RNdHggPC0gYXMubWF0cml4KHVud2VpZ2h0ZWREaXN0KQ0KDQojIE1lbHQgYW5kIHJlbW92ZSB2YWx1ZXMgb2YgMCB0byBlbGltaW5hdGUgZGlzdGFuY2VzIG9mIGVhY2ggc2FtcGxlIHRvIGl0c2VsZg0KdW53ZWlnaHRlZERpc3RNdHhfbWVsdCA8LSBzdWJzZXQocmVzaGFwZTI6Om1lbHQodW53ZWlnaHRlZERpc3RNdHgsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICJVbmlGcmFjX0Rpc3RhbmNlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmlGcmFjX0Rpc3RhbmNlICE9IDApDQoNCiMgQ2hhbmdlIFZhcjEgYW5kIFZhcjIgZnJvbSBmYWN0b3JzIHRvIGNoYXJhY3RlcnMgZm9yIGVhc2llciB1c2Ugd2l0aCBkcGx5cg0KZmFjdG9yQ29scyA8LSBjKCJWYXIxIiwgIlZhcjIiKQ0KdW53ZWlnaHRlZERpc3RNdHhfbWVsdFtmYWN0b3JDb2xzXSA8LSBsYXBwbHkodW53ZWlnaHRlZERpc3RNdHhfbWVsdFtmYWN0b3JDb2xzXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIpDQoNCiMgQWRkIGNvbHVtbnMgZm9yIGxhdGVyIHN1YnNldHRpbmcgd2hlbiBwbG90dGluZy4gIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBnZXQNCiMgICBwdWxsZWQgZnJvbSB0aGUgbWV0YWRhdGEgKG1ldGFkYXRhU3Rvb2wpLiAgV2l0aGluIHRoZSAqRGlzdE10eF9tZWx0IGRhdGEgDQojICAgZnJhbWVzLCB3ZSBuZWVkIGEgY29sdW1uIGluZGljYXRpbmcgd2hldGhlciBWYXIxIGFuZCBWYXIyIGFyZSBpbmZhbnRzLA0KIyAgIG1vdGhlcnMsIGFuZCB3aGV0aGVyIHRoZXkncmUgcmVsYXRlZC4NCnVud2VpZ2h0ZWREaXN0REYgPC0gdW53ZWlnaHRlZERpc3RNdHhfbWVsdA0KDQojIEFkZCBWYXIxIGFuZCBWYXIyIFR5cGUgYW5kIFp5Z29zaXR5IGNvbHVtbnMNCiMgUHV0IHJvd25hbWVzIGJhY2sgaW4gbWV0YWRhdGFTdG9vbCwgdGhlbiB1c2UgdGhlIHJvd25hbWVzIHRvIGxvY2F0ZSBuZWVkZWQgaW5mbw0KIyA8LSBjb2x1bW5fdG9fcm93bmFtZXMobWV0YWRhdGFTdG9vbCwgdmFyID0gIlR3aW5fcGFpcnMiKQ0KDQp1bndlaWdodGVkRGlzdERGIDwtIHVud2VpZ2h0ZWREaXN0REYgJT4lDQogIG11dGF0ZShWYXIxX1R5cGUgPSBtZXRhZGF0YVN0b29sW3Vud2VpZ2h0ZWREaXN0REYkVmFyMSwgIlR3aW5fcGFpcnMiXSwNCiAgICAgICAgIFZhcjJfVHlwZSA9IG1ldGFkYXRhU3Rvb2xbdW53ZWlnaHRlZERpc3RERiRWYXIyLCAiVHdpbl9wYWlycyJdKQ0KDQojIFRvIGVhc2lseSBkZXRlcm1pbmUgdGhlIHJlbGF0ZWRuZXNzIG9mIHRoZSBwYWlyZWQgc2FtcGxlcyBpbiBlYWNoIHJvdywNCiMgICBjcmVhdGUgInNob3J0IG5hbWVzIiB0byByZXBsYWNlIHRoZSBsb25nIHNhbXBsZSBuYW1lcy4NCiMgICBGaXJzdCBwdXQgdGhlIHJvd25hbWVzIGJhY2sgaW50byBhIGNvbHVtbi4NCg0KbWV0YWRhdGFTdG9vbCA8LSByb3duYW1lc190b19jb2x1bW4obWV0YWRhdGFTdG9vbCwgdmFyID0gIlNhbXBsZSIpDQoNCmx1dF9kZiA8LSBkcGx5cjo6c2VsZWN0KG1ldGFkYXRhU3Rvb2wsIFNhbXBsZSwgVHdpbl9wYWlycywgVHdpbl9wYWlycykNCg0KIyBjb252ZXJ0IGx1dF9kZiBpbnRvIGEgdmVjdG9yDQpsdXQgPC0gYXMuY2hhcmFjdGVyKGx1dF9kZiRUd2luX3BhaXJzKQ0KbmFtZXMobHV0KSA8LSBsdXRfZGYkU2FtcGxlDQoNCiMgQWRkIGluIHRoZSBzaG9ydCBuYW1lcyB0byB0aGUgZGlzdGFuY2UgZGF0YSBmcmFtZXMNCnVud2VpZ2h0ZWREaXN0REYkVmFyMV9TaG9ydE5hbWUgPC0gbHV0W3Vud2VpZ2h0ZWREaXN0REYkVmFyMV0NCnVud2VpZ2h0ZWREaXN0REYkVmFyMl9TaG9ydE5hbWUgPC0gbHV0W3Vud2VpZ2h0ZWREaXN0REYkVmFyMl0NCg0KIyBBZGQgYSBjb2x1bW4gaW5kaWNhdGluZyB3aGV0aGVyIGEgZ2l2ZW4gcm93IChwYWlyd2lzZSBjb21wYXJpc29uKSBpcyBiZXR3ZWVuDQojICAgdHdvIHJlbGF0ZWQgb3IgdW5yZWxhdGVkIHNhbXBsZXMuDQojICAgTG9vcCBvdmVyIHRoZSByb3dzIG9mIHRoZSBkaXN0YW5jZSBkZiwgc3BsaXQgVmFyMSBhbmQgVmFyMiBzaG9ydCBuYW1lcyBieSANCiMgICAiLiIgZGVsaW1pdGVyIGFuZCBjb21wYXJlIHRoZSAybmQgZWxlbWVudCBvZiB0aGUgcmVzdWx0aW5nIGxpc3Qgd2hpY2ggd2lsbCBob2xkIHRoZSANCiMgICBUYXJyIEZhbWlseSBJRCwNCg0KQWRkUGFpclJlbGF0aW9uIDwtIGZ1bmN0aW9uKGRmKSB7DQogIA0KICBvbGRERiA8LSBkZg0KICANCiAgcGFpclJlbGF0aW9uIDwtIHZlY3Rvcihtb2RlID0gImNoYXJhY3RlciIsIGxlbmd0aCA9IG5yb3cob2xkREYpKQ0KICANCiAgZm9yIChpIGluIDE6bnJvdyhvbGRERikpIHsNCiAgICBWYXIxX3NwbGl0IDwtIHN0cnNwbGl0KHggPSBkZltpLCAiVmFyMV9TaG9ydE5hbWUiXSwgc3BsaXQgPSAiXFwuIikNCiAgICBWYXIyX3NwbGl0IDwtIHN0cnNwbGl0KHggPSBkZltpLCAiVmFyMl9TaG9ydE5hbWUiXSwgc3BsaXQgPSAiXFwuIikNCiAgICANCiAgICBpZiAoVmFyMV9zcGxpdFtbMV1dW1sxXV0gPT0gVmFyMl9zcGxpdFtbMV1dW1sxXV0pIHsNCiAgICAgIHBhaXJSZWxhdGlvbltpXSA8LSAiQmV0d2VlbiBcbiB0d2lucyINCiAgICB9IGVsc2Ugew0KICAgICAgcGFpclJlbGF0aW9uW2ldIDwtICJCZXR3ZWVuIFxuIHVucmVsYXRlZCINCiAgICB9DQogIH0NCiAgDQogIG9sZERGJFBhaXJfUmVsYXRpb24gPC0gcGFpclJlbGF0aW9uDQogIA0KICByZXR1cm4ob2xkREYpDQogIA0KfQ0KDQp1bndlaWdodGVkRGlzdERGIDwtIEFkZFBhaXJSZWxhdGlvbih1bndlaWdodGVkRGlzdERGKQ0KDQojV2VpZ2h0ZWQgZGlzdGFuY2UgYm94cGxvdHMNCg0KQnJheVBsb3QudmlyLjMwIDwtIA0KICANCiAgZ2dwbG90KHVud2VpZ2h0ZWREaXN0REYsYWVzKFBhaXJfUmVsYXRpb24sVW5pRnJhY19EaXN0YW5jZSxmaWxsID0gUGFpcl9SZWxhdGlvbikpICsNCiAgZ2VvbV9ib3hwbG90KGFlcyhmaWxsID0gUGFpcl9SZWxhdGlvbiksb3V0bGllci5zaGFwZT1OQSkrDQogICMgIGdlb21faml0dGVyKHdpZHRoID0gMC4yKSArDQogIHlsYWIoIkJyYXktQ3VydGlzIGRpc3NpbWlsYXJpdHkiKSArDQogIHhsYWIoIkRheSAzMCIpICsNCiAgdGhlbWVfcHViY2xlYW4oKSArDQogIHNjYWxlX2ZpbGxfamNvKCkgKw0KICBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gIndpbGNveC50ZXN0IiAsYWVzKGxhYmVsID0gcGFzdGUwKCJwID0gIiwgLi5wLmZvcm1hdC4uKSksbGFiZWwueC5ucGM9ImNlbnRlciIsbGFiZWwueT0wLjUwKSArDQogIGd1aWRlcyhmaWxsPSJub25lIikgKw0KICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpDQojQnJheVBsb3QudmlyDQoNCnBsb3RfZ3JpZChCcmF5UGxvdC5iYWMuMzAsQnJheVBsb3QudmlyLjMwLCBucm93ID0gMSkNCmBgYA0KDQojIyMgRGF5IDkwDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9DQpzb3VyY2UoIkhlbHBlcl9GdW5jdGlvbnMuUiIpDQoNClBTQi5DU1Muc3ViIDwtIHN1YnNldF9zYW1wbGVzKFBTQi5DU1MsIERheXMgPT0gIjkwIikgDQoNClBTVi5DU1Muc3ViIDwtIHN1YnNldF9zYW1wbGVzKFBTVi5DU1MsIERheXMgPT0gIjkwIikgDQoNCiMjIyMjIyMjIyMjIyNHZW5lcmF0ZSBCcmF5IGN1cnRpcyBwYWlyd2lzZSBkaXN0YW5jZSBkYXRhIGZyYW1lOg0KDQojIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2Ugb2JqZWN0DQptZXRhZGF0YVN0b29sIDwtIGRhdGEuZnJhbWUoc2FtcGxlX2RhdGEoUFNCLkNTUy5zdWIpKQ0KDQp1bndlaWdodGVkRGlzdCA8LSBhcy5tYXRyaXgodChQU0IuQ1NTLnN1YkBvdHVfdGFibGUpKQ0KDQp1bndlaWdodGVkRGlzdCA8LSB2ZWdkaXN0KHVud2VpZ2h0ZWREaXN0LCBkaXN0ID0gImJyYXkiKQ0KDQojIENvZXJjZSBkaXN0YW5jZSBvYmplY3QgaW50byBtYXRyaXgNCnVud2VpZ2h0ZWREaXN0TXR4IDwtIGFzLm1hdHJpeCh1bndlaWdodGVkRGlzdCkNCg0KIyBNZWx0IGFuZCByZW1vdmUgdmFsdWVzIG9mIDAgdG8gZWxpbWluYXRlIGRpc3RhbmNlcyBvZiBlYWNoIHNhbXBsZSB0byBpdHNlbGYNCnVud2VpZ2h0ZWREaXN0TXR4X21lbHQgPC0gc3Vic2V0KHJlc2hhcGUyOjptZWx0KHVud2VpZ2h0ZWREaXN0TXR4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLm5hbWUgPSAiVW5pRnJhY19EaXN0YW5jZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pRnJhY19EaXN0YW5jZSAhPSAwKQ0KDQojIENoYW5nZSBWYXIxIGFuZCBWYXIyIGZyb20gZmFjdG9ycyB0byBjaGFyYWN0ZXJzIGZvciBlYXNpZXIgdXNlIHdpdGggZHBseXINCmZhY3RvckNvbHMgPC0gYygiVmFyMSIsICJWYXIyIikNCnVud2VpZ2h0ZWREaXN0TXR4X21lbHRbZmFjdG9yQ29sc10gPC0gbGFwcGx5KHVud2VpZ2h0ZWREaXN0TXR4X21lbHRbZmFjdG9yQ29sc10sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKQ0KDQojIEFkZCBjb2x1bW5zIGZvciBsYXRlciBzdWJzZXR0aW5nIHdoZW4gcGxvdHRpbmcuICBUaGlzIGluZm9ybWF0aW9uIHdpbGwgZ2V0DQojICAgcHVsbGVkIGZyb20gdGhlIG1ldGFkYXRhIChtZXRhZGF0YVN0b29sKS4gIFdpdGhpbiB0aGUgKkRpc3RNdHhfbWVsdCBkYXRhIA0KIyAgIGZyYW1lcywgd2UgbmVlZCBhIGNvbHVtbiBpbmRpY2F0aW5nIHdoZXRoZXIgVmFyMSBhbmQgVmFyMiBhcmUgaW5mYW50cywNCiMgICBtb3RoZXJzLCBhbmQgd2hldGhlciB0aGV5J3JlIHJlbGF0ZWQuDQp1bndlaWdodGVkRGlzdERGIDwtIHVud2VpZ2h0ZWREaXN0TXR4X21lbHQNCg0KIyBBZGQgVmFyMSBhbmQgVmFyMiBUeXBlIGFuZCBaeWdvc2l0eSBjb2x1bW5zDQojIFB1dCByb3duYW1lcyBiYWNrIGluIG1ldGFkYXRhU3Rvb2wsIHRoZW4gdXNlIHRoZSByb3duYW1lcyB0byBsb2NhdGUgbmVlZGVkIGluZm8NCiMgPC0gY29sdW1uX3RvX3Jvd25hbWVzKG1ldGFkYXRhU3Rvb2wsIHZhciA9ICJUd2luX3BhaXJzIikNCg0KdW53ZWlnaHRlZERpc3RERiA8LSB1bndlaWdodGVkRGlzdERGICU+JQ0KICBtdXRhdGUoVmFyMV9UeXBlID0gbWV0YWRhdGFTdG9vbFt1bndlaWdodGVkRGlzdERGJFZhcjEsICJUd2luX3BhaXJzIl0sDQogICAgICAgICBWYXIyX1R5cGUgPSBtZXRhZGF0YVN0b29sW3Vud2VpZ2h0ZWREaXN0REYkVmFyMiwgIlR3aW5fcGFpcnMiXSkNCg0KIyBUbyBlYXNpbHkgZGV0ZXJtaW5lIHRoZSByZWxhdGVkbmVzcyBvZiB0aGUgcGFpcmVkIHNhbXBsZXMgaW4gZWFjaCByb3csDQojICAgY3JlYXRlICJzaG9ydCBuYW1lcyIgdG8gcmVwbGFjZSB0aGUgbG9uZyBzYW1wbGUgbmFtZXMuDQojICAgRmlyc3QgcHV0IHRoZSByb3duYW1lcyBiYWNrIGludG8gYSBjb2x1bW4uDQoNCm1ldGFkYXRhU3Rvb2wgPC0gcm93bmFtZXNfdG9fY29sdW1uKG1ldGFkYXRhU3Rvb2wsIHZhciA9ICJTYW1wbGUiKQ0KDQpsdXRfZGYgPC0gZHBseXI6OnNlbGVjdChtZXRhZGF0YVN0b29sLCBTYW1wbGUsIFR3aW5fcGFpcnMsIFR3aW5fcGFpcnMpDQoNCiMgY29udmVydCBsdXRfZGYgaW50byBhIHZlY3Rvcg0KbHV0IDwtIGFzLmNoYXJhY3RlcihsdXRfZGYkVHdpbl9wYWlycykNCm5hbWVzKGx1dCkgPC0gbHV0X2RmJFNhbXBsZQ0KDQojIEFkZCBpbiB0aGUgc2hvcnQgbmFtZXMgdG8gdGhlIGRpc3RhbmNlIGRhdGEgZnJhbWVzDQp1bndlaWdodGVkRGlzdERGJFZhcjFfU2hvcnROYW1lIDwtIGx1dFt1bndlaWdodGVkRGlzdERGJFZhcjFdDQp1bndlaWdodGVkRGlzdERGJFZhcjJfU2hvcnROYW1lIDwtIGx1dFt1bndlaWdodGVkRGlzdERGJFZhcjJdDQoNCiMgQWRkIGEgY29sdW1uIGluZGljYXRpbmcgd2hldGhlciBhIGdpdmVuIHJvdyAocGFpcndpc2UgY29tcGFyaXNvbikgaXMgYmV0d2Vlbg0KIyAgIHR3byByZWxhdGVkIG9yIHVucmVsYXRlZCBzYW1wbGVzLg0KIyAgIExvb3Agb3ZlciB0aGUgcm93cyBvZiB0aGUgZGlzdGFuY2UgZGYsIHNwbGl0IFZhcjEgYW5kIFZhcjIgc2hvcnQgbmFtZXMgYnkgDQojICAgIi4iIGRlbGltaXRlciBhbmQgY29tcGFyZSB0aGUgMm5kIGVsZW1lbnQgb2YgdGhlIHJlc3VsdGluZyBsaXN0IHdoaWNoIHdpbGwgaG9sZCB0aGUgDQojICAgVGFyciBGYW1pbHkgSUQsDQoNCkFkZFBhaXJSZWxhdGlvbiA8LSBmdW5jdGlvbihkZikgew0KICANCiAgb2xkREYgPC0gZGYNCiAgDQogIHBhaXJSZWxhdGlvbiA8LSB2ZWN0b3IobW9kZSA9ICJjaGFyYWN0ZXIiLCBsZW5ndGggPSBucm93KG9sZERGKSkNCiAgDQogIGZvciAoaSBpbiAxOm5yb3cob2xkREYpKSB7DQogICAgVmFyMV9zcGxpdCA8LSBzdHJzcGxpdCh4ID0gZGZbaSwgIlZhcjFfU2hvcnROYW1lIl0sIHNwbGl0ID0gIlxcLiIpDQogICAgVmFyMl9zcGxpdCA8LSBzdHJzcGxpdCh4ID0gZGZbaSwgIlZhcjJfU2hvcnROYW1lIl0sIHNwbGl0ID0gIlxcLiIpDQogICAgDQogICAgaWYgKFZhcjFfc3BsaXRbWzFdXVtbMV1dID09IFZhcjJfc3BsaXRbWzFdXVtbMV1dKSB7DQogICAgICBwYWlyUmVsYXRpb25baV0gPC0gIkJldHdlZW4gXG4gdHdpbnMiDQogICAgfSBlbHNlIHsNCiAgICAgIHBhaXJSZWxhdGlvbltpXSA8LSAiQmV0d2VlbiBcbiB1bnJlbGF0ZWQiDQogICAgfQ0KICB9DQogIA0KICBvbGRERiRQYWlyX1JlbGF0aW9uIDwtIHBhaXJSZWxhdGlvbg0KICANCiAgcmV0dXJuKG9sZERGKQ0KICANCn0NCg0KdW53ZWlnaHRlZERpc3RERiA8LSBBZGRQYWlyUmVsYXRpb24odW53ZWlnaHRlZERpc3RERikNCg0KI1dlaWdodGVkIGRpc3RhbmNlIGJveHBsb3RzDQoNCkJyYXlQbG90LmJhYy45MCA8LSANCiAgDQogIGdncGxvdCh1bndlaWdodGVkRGlzdERGLGFlcyhQYWlyX1JlbGF0aW9uLFVuaUZyYWNfRGlzdGFuY2UsZmlsbCA9IFBhaXJfUmVsYXRpb24pKSArDQogIGdlb21fYm94cGxvdChhZXMoZmlsbCA9IFBhaXJfUmVsYXRpb24pLG91dGxpZXIuc2hhcGU9TkEpKw0KICAjICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMikgKw0KICB5bGFiKCJCcmF5LUN1cnRpcyBkaXNzaW1pbGFyaXR5IikgKw0KICB4bGFiKCJEYXkgOTAiKSArDQogIHRoZW1lX3B1YmNsZWFuKCkgKw0KICBzY2FsZV9maWxsX2pjbygpICsNCiAgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIgLGFlcyhsYWJlbCA9IHBhc3RlMCgicCA9ICIsIC4ucC5mb3JtYXQuLikpLGxhYmVsLngubnBjPSJjZW50ZXIiLGxhYmVsLnk9MC40KSArDQogIGd1aWRlcyhmaWxsPSJub25lIikgKw0KICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpDQoNCiNCcmF5UGxvdC5iYWMNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNWaXJvbWUNCg0KIyMjIyMjIyMjIyMjI0dlbmVyYXRlIEJyYXkgY3VydGlzIHBhaXJ3aXNlIGRpc3RhbmNlIGRhdGEgZnJhbWU6DQoNCiMgQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBvYmplY3QNCm1ldGFkYXRhU3Rvb2wgPC0gZGF0YS5mcmFtZShzYW1wbGVfZGF0YShQU1YuQ1NTLnN1YikpDQoNCnVud2VpZ2h0ZWREaXN0IDwtIGFzLm1hdHJpeCh0KFBTVi5DU1Muc3ViQG90dV90YWJsZSkpDQoNCnVud2VpZ2h0ZWREaXN0IDwtIHZlZ2Rpc3QodW53ZWlnaHRlZERpc3QsIGRpc3QgPSAiYnJheSIpDQoNCiMgQ29lcmNlIGRpc3RhbmNlIG9iamVjdCBpbnRvIG1hdHJpeA0KdW53ZWlnaHRlZERpc3RNdHggPC0gYXMubWF0cml4KHVud2VpZ2h0ZWREaXN0KQ0KDQojIE1lbHQgYW5kIHJlbW92ZSB2YWx1ZXMgb2YgMCB0byBlbGltaW5hdGUgZGlzdGFuY2VzIG9mIGVhY2ggc2FtcGxlIHRvIGl0c2VsZg0KdW53ZWlnaHRlZERpc3RNdHhfbWVsdCA8LSBzdWJzZXQocmVzaGFwZTI6Om1lbHQodW53ZWlnaHRlZERpc3RNdHgsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICJVbmlGcmFjX0Rpc3RhbmNlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmlGcmFjX0Rpc3RhbmNlICE9IDApDQoNCiMgQ2hhbmdlIFZhcjEgYW5kIFZhcjIgZnJvbSBmYWN0b3JzIHRvIGNoYXJhY3RlcnMgZm9yIGVhc2llciB1c2Ugd2l0aCBkcGx5cg0KZmFjdG9yQ29scyA8LSBjKCJWYXIxIiwgIlZhcjIiKQ0KdW53ZWlnaHRlZERpc3RNdHhfbWVsdFtmYWN0b3JDb2xzXSA8LSBsYXBwbHkodW53ZWlnaHRlZERpc3RNdHhfbWVsdFtmYWN0b3JDb2xzXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIpDQoNCiMgQWRkIGNvbHVtbnMgZm9yIGxhdGVyIHN1YnNldHRpbmcgd2hlbiBwbG90dGluZy4gIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBnZXQNCiMgICBwdWxsZWQgZnJvbSB0aGUgbWV0YWRhdGEgKG1ldGFkYXRhU3Rvb2wpLiAgV2l0aGluIHRoZSAqRGlzdE10eF9tZWx0IGRhdGEgDQojICAgZnJhbWVzLCB3ZSBuZWVkIGEgY29sdW1uIGluZGljYXRpbmcgd2hldGhlciBWYXIxIGFuZCBWYXIyIGFyZSBpbmZhbnRzLA0KIyAgIG1vdGhlcnMsIGFuZCB3aGV0aGVyIHRoZXkncmUgcmVsYXRlZC4NCnVud2VpZ2h0ZWREaXN0REYgPC0gdW53ZWlnaHRlZERpc3RNdHhfbWVsdA0KDQojIEFkZCBWYXIxIGFuZCBWYXIyIFR5cGUgYW5kIFp5Z29zaXR5IGNvbHVtbnMNCiMgUHV0IHJvd25hbWVzIGJhY2sgaW4gbWV0YWRhdGFTdG9vbCwgdGhlbiB1c2UgdGhlIHJvd25hbWVzIHRvIGxvY2F0ZSBuZWVkZWQgaW5mbw0KIyA8LSBjb2x1bW5fdG9fcm93bmFtZXMobWV0YWRhdGFTdG9vbCwgdmFyID0gIlR3aW5fcGFpcnMiKQ0KDQp1bndlaWdodGVkRGlzdERGIDwtIHVud2VpZ2h0ZWREaXN0REYgJT4lDQogIG11dGF0ZShWYXIxX1R5cGUgPSBtZXRhZGF0YVN0b29sW3Vud2VpZ2h0ZWREaXN0REYkVmFyMSwgIlR3aW5fcGFpcnMiXSwNCiAgICAgICAgIFZhcjJfVHlwZSA9IG1ldGFkYXRhU3Rvb2xbdW53ZWlnaHRlZERpc3RERiRWYXIyLCAiVHdpbl9wYWlycyJdKQ0KDQojIFRvIGVhc2lseSBkZXRlcm1pbmUgdGhlIHJlbGF0ZWRuZXNzIG9mIHRoZSBwYWlyZWQgc2FtcGxlcyBpbiBlYWNoIHJvdywNCiMgICBjcmVhdGUgInNob3J0IG5hbWVzIiB0byByZXBsYWNlIHRoZSBsb25nIHNhbXBsZSBuYW1lcy4NCiMgICBGaXJzdCBwdXQgdGhlIHJvd25hbWVzIGJhY2sgaW50byBhIGNvbHVtbi4NCg0KbWV0YWRhdGFTdG9vbCA8LSByb3duYW1lc190b19jb2x1bW4obWV0YWRhdGFTdG9vbCwgdmFyID0gIlNhbXBsZSIpDQoNCmx1dF9kZiA8LSBkcGx5cjo6c2VsZWN0KG1ldGFkYXRhU3Rvb2wsIFNhbXBsZSwgVHdpbl9wYWlycywgVHdpbl9wYWlycykNCg0KIyBjb252ZXJ0IGx1dF9kZiBpbnRvIGEgdmVjdG9yDQpsdXQgPC0gYXMuY2hhcmFjdGVyKGx1dF9kZiRUd2luX3BhaXJzKQ0KbmFtZXMobHV0KSA8LSBsdXRfZGYkU2FtcGxlDQoNCiMgQWRkIGluIHRoZSBzaG9ydCBuYW1lcyB0byB0aGUgZGlzdGFuY2UgZGF0YSBmcmFtZXMNCnVud2VpZ2h0ZWREaXN0REYkVmFyMV9TaG9ydE5hbWUgPC0gbHV0W3Vud2VpZ2h0ZWREaXN0REYkVmFyMV0NCnVud2VpZ2h0ZWREaXN0REYkVmFyMl9TaG9ydE5hbWUgPC0gbHV0W3Vud2VpZ2h0ZWREaXN0REYkVmFyMl0NCg0KIyBBZGQgYSBjb2x1bW4gaW5kaWNhdGluZyB3aGV0aGVyIGEgZ2l2ZW4gcm93IChwYWlyd2lzZSBjb21wYXJpc29uKSBpcyBiZXR3ZWVuDQojICAgdHdvIHJlbGF0ZWQgb3IgdW5yZWxhdGVkIHNhbXBsZXMuDQojICAgTG9vcCBvdmVyIHRoZSByb3dzIG9mIHRoZSBkaXN0YW5jZSBkZiwgc3BsaXQgVmFyMSBhbmQgVmFyMiBzaG9ydCBuYW1lcyBieSANCiMgICAiLiIgZGVsaW1pdGVyIGFuZCBjb21wYXJlIHRoZSAybmQgZWxlbWVudCBvZiB0aGUgcmVzdWx0aW5nIGxpc3Qgd2hpY2ggd2lsbCBob2xkIHRoZSANCiMgICBUYXJyIEZhbWlseSBJRCwNCg0KQWRkUGFpclJlbGF0aW9uIDwtIGZ1bmN0aW9uKGRmKSB7DQogIA0KICBvbGRERiA8LSBkZg0KICANCiAgcGFpclJlbGF0aW9uIDwtIHZlY3Rvcihtb2RlID0gImNoYXJhY3RlciIsIGxlbmd0aCA9IG5yb3cob2xkREYpKQ0KICANCiAgZm9yIChpIGluIDE6bnJvdyhvbGRERikpIHsNCiAgICBWYXIxX3NwbGl0IDwtIHN0cnNwbGl0KHggPSBkZltpLCAiVmFyMV9TaG9ydE5hbWUiXSwgc3BsaXQgPSAiXFwuIikNCiAgICBWYXIyX3NwbGl0IDwtIHN0cnNwbGl0KHggPSBkZltpLCAiVmFyMl9TaG9ydE5hbWUiXSwgc3BsaXQgPSAiXFwuIikNCiAgICANCiAgICBpZiAoVmFyMV9zcGxpdFtbMV1dW1sxXV0gPT0gVmFyMl9zcGxpdFtbMV1dW1sxXV0pIHsNCiAgICAgIHBhaXJSZWxhdGlvbltpXSA8LSAiQmV0d2VlbiBcbiB0d2lucyINCiAgICB9IGVsc2Ugew0KICAgICAgcGFpclJlbGF0aW9uW2ldIDwtICJCZXR3ZWVuIFxuIHVucmVsYXRlZCINCiAgICB9DQogIH0NCiAgDQogIG9sZERGJFBhaXJfUmVsYXRpb24gPC0gcGFpclJlbGF0aW9uDQogIA0KICByZXR1cm4ob2xkREYpDQogIA0KfQ0KDQp1bndlaWdodGVkRGlzdERGIDwtIEFkZFBhaXJSZWxhdGlvbih1bndlaWdodGVkRGlzdERGKQ0KDQojV2VpZ2h0ZWQgZGlzdGFuY2UgYm94cGxvdHMNCg0Kc3ltbnVtIDwtIGxpc3QoY3V0cG9pbnRzID0gYygwLCAwLjAwMDEsIDAuMDAxLCAwLjAxLCAwLjA1LCAxKSwgc3ltYm9scyA9IGMoIioqKioiLCAiKioqIiwgIioqIiwgIioiLCAibnMiKSkNCg0KQnJheVBsb3QudmlyLjkwIDwtIA0KICANCiAgZ2dwbG90KHVud2VpZ2h0ZWREaXN0REYsYWVzKFBhaXJfUmVsYXRpb24sVW5pRnJhY19EaXN0YW5jZSxmaWxsID0gUGFpcl9SZWxhdGlvbikpICsNCiAgZ2VvbV9ib3hwbG90KGFlcyhmaWxsID0gUGFpcl9SZWxhdGlvbiksb3V0bGllci5zaGFwZT1OQSkrDQogICMgIGdlb21faml0dGVyKHdpZHRoID0gMC4yKSArDQogIHlsYWIoIkJyYXktQ3VydGlzIGRpc3NpbWlsYXJpdHkiKSArDQogIHhsYWIoIkRheSA5MCIpICsNCiAgdGhlbWVfcHViY2xlYW4oKSArDQogIHNjYWxlX2ZpbGxfamNvKCkgKw0KICBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gIndpbGNveC50ZXN0IiAsIGFlcyhsYWJlbCA9IHBhc3RlMCgicCA9ICIsIC4ucC5mb3JtYXQuLikpLGxhYmVsLngubnBjPSJjZW50ZXIiLGxhYmVsLnk9MC40NSkgKw0KICBndWlkZXMoZmlsbD0ibm9uZSIpICsNCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKQ0KDQojQnJheVBsb3QudmlyDQoNCnBsb3RfZ3JpZChCcmF5UGxvdC5iYWMuOTAsQnJheVBsb3QudmlyLjkwLCBucm93ID0gMSkNCmBgYA0KDQojIEVmZmVjdCBzaXplDQoNCiMjIEJhY3RlcmlhDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRn0NCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjSW1wb3J0aW5nLURhdGENCg0KIyMjIyMjIyMjQmFjdGVyaWENCg0KI3N0YW5kZiA9IGZ1bmN0aW9uKHgsIHQ9dG90YWwpIHJvdW5kKHQgKiAoeCAvIHN1bSh4KSkpDQojdG90YWwgPSBtZWRpYW4oc2FtcGxlX3N1bXMoUFNCKSkNCiNQU0IuUiA9IHRyYW5zZm9ybV9zYW1wbGVfY291bnRzKFBTQiwgc3RhbmRmKQ0KDQppbXBvcnQub3R1LnRhYmxlIDwtIGFzLmRhdGEuZnJhbWUob3R1X3RhYmxlKFBTQikpICU+JQ0KICAjZHBseXI6OnNlbGVjdCgtdGF4b25vbXkpICU+JQ0KICBtdXRhdGVfYWxsKGFzLm51bWVyaWMpICNDb252ZXJ0IHRvIG51bWVyaWMgd2hlcmUgcG9zc2libGUNCg0KY3VyZS5kYXRhID0gbWV0YS5iYWMNCg0KI2ltcG9ydC50YXhvbm9teSA9IHJlYWQudGFibGUoJ3Zpcm9tZV90YXhvbm9teV9MQ0Ffa25vd24udHh0JywgaGVhZGVyID0gVCkNCg0Kcm93bmFtZXMgPC0gcm93bmFtZXMoY3VyZS5kYXRhKQ0KDQojUmVtb3ZlIE5BIGNvbG9tbnMNCg0KY3VyZS5kYXRhIDwtIGN1cmUuZGF0YVsgLCAhIGFwcGx5KCBjdXJlLmRhdGEgLCAyICwgZnVuY3Rpb24oeCkgYWxsKGlzLm5hKHgpKSApIF0NCg0KI1NldCBudW1lcmljIGNvbHVtbiBjbGFzcw0KY3VyZS5kYXRhIDwtIGN1cmUuZGF0YSAlPiUgbXV0YXRlX2lmKGlzLmNoYXJhY3Rlcixhcy5mYWN0b3IpDQojQWRkIGJhY2sgcm93bmFtZXMNCg0Kcm93bmFtZXMoY3VyZS5kYXRhKSA8LSByb3duYW1lcw0KDQojY3VyZS5kYXRhIDwtIGN1cmUuZGF0YSAlPiUgbXV0YXRlX2lmKGlzLmNoYXJhY3RlciwgYXMubnVtZXJpYykNCg0KWDgubm9ucmFyZWZpZWQgPSB0KGltcG9ydC5vdHUudGFibGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjJSUlIG5vbi1yYXJlZmllZA0KDQoNCiMjI3JhcmVmeWluZ3xzdWJzYW1wbGluZyByZWFkcyBpbiBldmVyeSBzYW1wbGUNCmJhcnBsb3QoY29sU3VtcyhpbXBvcnQub3R1LnRhYmxlKSkNCm1pbihjb2xTdW1zKGltcG9ydC5vdHUudGFibGUpKQ0KDQpyYXJlOCA8LSB0KGltcG9ydC5vdHUudGFibGUpDQojcmFyZTggPSByYXJlZnkodChpbXBvcnQub3R1LnRhYmxlKSwgc2FtcGxlID0gMjAwMDApDQpYOC5yYXJlZmllZCA9IGFzLmRhdGEuZnJhbWUocmFyZTgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMlJSUgcmFyZWZpZWQNCg0KIyMjU3Vic2V0IG1ldGFkYXRhIHRvIG1hdGNoIHJlbWFpbmluZyBzYW1wbGVzIGFmdGVyIHJhcmVmYWN0aW9uDQoNClkuYWxsID0gY3VyZS5kYXRhW3Jvd25hbWVzKFg4LnJhcmVmaWVkKSxdDQoNCiMjI0xvZyB0cmFuZm9ybWF0aW9uDQpYID0gbG9nMTAoWDgucmFyZWZpZWQrMSkNCg0KI1NlbGVjdCByZWxldmFudCBudW1lcmljIGNvbHVtbg0KDQpZIDwtIGRwbHlyOjpzZWxlY3QoWS5hbGwsYygiVHdpbl9wYWlycyIsICJEYXlzIiwgIkdlc3RhdGlvbmFsX2FnZSIsICJCaXJ0aF93ZWlnaHQiLCAiU21hbGxfZm9yX2dlc3RhdGlvbmFsX2FnZSIsICJBbnRlbmF0YWxfc3Rlcm9pZHMiICwgIkRlbGl2ZXJ5X21vZGUiLCAiSW50cmFwYXJ0dW1fYW50aWJpb3RpY19wcm9waHlsYXhpcyIsICJMYXRlX29uc2V0X3NlcHNpcyIgLCAiTmVjcm90aXppbmdfZW50ZXJvY29saXRpcyIsICJQYXRlbnRfZHVjdHVzX2FydGVyaW9zdXMiLCAiQnJvbmNob3B1bG1vbmFyeV9keXNwbGFzaWEiLCAiQW50aWJpb3RpY3NfYXRfYmlydGgiLCAiVG90YWxfZGF5c19hbnRpYmlvdGljc190aGVyYXB5IikpDQoNCiNjb2xuYW1lcyhZKSAjQ2hlY2sgcmVtYWluaW5nIGNvbHVtbnMNCg0KIyMjU2VsZWN0IG9ubHkgbnVtZXJpYyBtZXRhZGF0YSBjdWx1bW5zDQoNCiNZICA8LSBZICU+JSBtdXRhdGVfYWxsKGFzLm51bWVyaWMpDQoNCiNjb2xuYW1lcyhZKSAjQ2hlY2sgcmVtYWluaW5nIGNvbHVtbnMNCg0KIyN2aWZjb3INCiNjb2xsaW5lYXJpdHkgPC0gdmlmY29yKFksIHRoICA9MC41KSAjYXQgMC41IHRocmVzaG9sZCB2YXJpYWJsZXMgaGF2ZSBhIFZJRiBiZWxvdyAxMC4wMCAoPDAuMjEgY29ycmVsYXRpb24hKQ0KI2NvbGxpbmVhcml0eQ0KDQojU2VsZWN0IHJlbGV2YW50IGNvbHVtbnMgZm9yIHRoYXQgYXJlIG5vbi1jb2xsaW5lYXINCg0KWS5hZCA9IFkNCiNZLmFkIDwtIGRwbHlyOjpzZWxlY3QoWS5hbGwsYygiQmF0Y2giLCAiVGltZSIpDQoNCiNZLmFkIDwtIFkuYWxsWzg6MjNdDQoNCiNSZW1vdmUgTkEgcm93cw0KDQpZLmFkIDwtIFkuYWQgJT4lIGRyb3BfbmEoKQ0KDQpYLmFkIDwtIFhbcm93bmFtZXMoWS5hZCksXQ0KDQojaXMubmEoWS5hZCkNCmBgYA0KDQojIyMgRGIgYW5vdmEgLSBjb25zdHJhaW5lZCBieSB0aW1lIHBvaW50DQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9DQojIyMjIyMjIyMjIyMjI0Fub3ZhIG9uIGNhcHNjYWxlIC0gYWxsIHZhcmlhYmxlcw0KDQphbm92YS5tIDwtIG1hdHJpeChucm93ID0gMCwgbmNvbCA9NikgI0NyZWF0ZSBtYXRyaXggZm9yIHJlc3VsdHMNCmNvbG5hbWVzKGFub3ZhLm0pIDwtIGMoIkRmIiwiU3VtT2ZTcXMiLCJGIiwiUHIuRiIsIlJlc2lkdWFsLkRmIiwiUmVzaWR1YWwuU3VtT2ZTcXMiKSAgICAgICAgICAgICAgICANCmZvciAoaSBpbiBjb2xuYW1lcyhkcGx5cjo6c2VsZWN0KFkuYWQsLWMoIkRheXMiKSkpKXsNCiAgYW5vdmEgPC0gYXMubWF0cml4KGFub3ZhLmNjYShjYXBzY2FsZShYLmFkIH4gWS5hZFssaV0gKyBDb25kaXRpb24oRGF5cyksIFkuYWQsIGRpc3QgPSAiYnJheSIpLHBlcm11dGF0aW9ucyA9IGhvdyhucGVybT05OTk5KSkpDQogIGFub3ZhIDwtIGMoYW5vdmFbMSxdLGFub3ZhWzIsMToyXSkNCiAgYW5vdmEubSA8LXJiaW5kKGFub3ZhLm0sYW5vdmEpDQp9DQoNCnJvd25hbWVzKGFub3ZhLm0pIDwtIGNvbG5hbWVzKGRwbHlyOjpzZWxlY3QoWS5hZCwtYygiRGF5cyIpKSkNCg0KI1ByZXBhcmUgZm9yIHBsb3R0aW5nDQoNCmFub3ZhLmRhdCA8LSBhbm92YS5tICU+JQ0KICBhcy5kYXRhLmZyYW1lKCkgJT4lDQogIHRpYmJsZTo6YWRkX2NvbHVtbihWYXJpYWJsZSA9IHJvd25hbWVzKGFub3ZhLm0pLC5uYW1lX3JlcGFpciA9ICJtaW5pbWFsIikgDQoNCiNBZGQgYWRqdXN0ZWQgcC12YWx1ZXMNCmFub3ZhLmRhdCRQci5GLmFkaiA8LSBwLmFkanVzdChhbm92YS5kYXQkUHIuRiwgbWV0aG9kID0gJ2hvbG0nKQ0KDQojU2hvdyB0YWJsZQ0KI2tuaXRyOjprYWJsZShhbm92YS5kYXQpDQoNCiNDYWxjdWxhdGUgUl4yIGZyb20gc3VtIG9mIHNxdWFyZXMNCmFub3ZhLmRhdCRSMiA8LSBhbm92YS5kYXQkU3VtT2ZTcXMgLyAoYW5vdmEuZGF0JFN1bU9mU3FzICsgYW5vdmEuZGF0JFJlc2lkdWFsLlN1bU9mU3FzKQ0KDQojI0ZhbmN5IHBsb3QNCg0KYW5vdmEubWVsdCA8LSB0aWR5cjo6cGl2b3RfbG9uZ2VyKGFub3ZhLmRhdCxjb2xzPWMoIlIyIiksIG5hbWVzX3RvPSdtZWFzdXJlJywgdmFsdWVzX3RvPSJ2YWx1ZSIpICU+JQ0KICBhZGRfc2lnbmlmaWNhbmNlKHAuY29sID0gIlByLkYuYWRqIiwgb3V0cHV0LmNvbCA9ICJQckYuc3ltIiwNCiAgICAgICAgICAgICAgICAgICBjdXRwb2ludHMgPSBjKDAsIDFlLTA0LCAwLjAwMSwgMC4wMSwgMC4wNSwgMC4xLDEpLA0KICAgICAgICAgICAgICAgICAgIHN5bWJvbHMgPSBjKCIqKioqIiwgIioqKiIsICIqKiIsICIqIiwgIlx1MDJEOSIsICIiKQ0KICAgICAgICAgICAgICAgICAgICkgJT4lDQogIGFycmFuZ2UodmFsdWUpDQoNCmFub3ZhLm1lbHQuYmFjIDwtIGFub3ZhLm1lbHQgJT4lIG11dGF0ZShWYXJpYWJsZSA9IGdzdWIoIl8iLCAiICIsVmFyaWFibGUpKQ0KDQpmYW5jeS5hbm92YS5iYXIuYmFjIDwtIGdnYmFycGxvdChhbm92YS5tZWx0LmJhYywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeD0iVmFyaWFibGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5PSJ2YWx1ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjb2xvciA9ICJWYXJpYWJsZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gYygiaG9yaXpvbnRhbCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IE5BLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gIm1lYXN1cmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGFub3ZhLm1lbHQkUHJGLnN5bSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiLnNpemUgPSA5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWIudmp1c3QgPSAwLjcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYi5oanVzdCA9IC0wLjMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQopICsNCiAgI3N0YXRfcHZhbHVlX21hbnVhbCgNCiAgIyAgYWRvbmlzLm1lbHQsICBsYWJlbCA9ICJQckYuc3ltIiwgdGlwLmxlbmd0aCA9IDAuMDENCiAgIykgKw0KICAjZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC4wNSkgKw0KICBnZ3RpdGxlKCJDYXBzY2FsZSBkYlJEQSBlZmZlY3Qgc2l6ZTogYWxsIHZhcmlhYmxlcyIpICsNCiAgeWxhYihleHByZXNzaW9uKFJeMn4idmFsdWUiKSkgKw0KICBzY2FsZV9maWxsX2pjbygpDQoNCmZhbmN5LmFub3ZhLmJhci5iYWMNCmBgYA0KDQojIyBWaXJvbWUNCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGfQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNJbXBvcnRpbmctRGF0YQ0KDQojc3RhbmRmID0gZnVuY3Rpb24oeCwgdD10b3RhbCkgcm91bmQodCAqICh4IC8gc3VtKHgpKSkNCiN0b3RhbCA9IG1lZGlhbihzYW1wbGVfc3VtcyhQU1YpKQ0KI1BTVi5SID0gdHJhbnNmb3JtX3NhbXBsZV9jb3VudHMoUFNWLCBzdGFuZGYpDQoNCmltcG9ydC5vdHUudGFibGUgPC0gYXMuZGF0YS5mcmFtZShvdHVfdGFibGUoUFNWKSkgJT4lDQogICNkcGx5cjo6c2VsZWN0KC10YXhvbm9teSkgJT4lDQogIG11dGF0ZV9hbGwoYXMubnVtZXJpYykgI0NvbnZlcnQgdG8gbnVtZXJpYyB3aGVyZSBwb3NzaWJsZQ0KDQpjdXJlLmRhdGEgPSBtZXRhLnZpcg0KDQojaW1wb3J0LnRheG9ub215ID0gcmVhZC50YWJsZSgndmlyb21lX3RheG9ub215X0xDQV9rbm93bi50eHQnLCBoZWFkZXIgPSBUKQ0KDQpyb3duYW1lcyA8LSByb3duYW1lcyhjdXJlLmRhdGEpDQoNCiNSZW1vdmUgTkEgY29sb21ucw0KDQpjdXJlLmRhdGEgPC0gY3VyZS5kYXRhWyAsICEgYXBwbHkoIGN1cmUuZGF0YSAsIDIgLCBmdW5jdGlvbih4KSBhbGwoaXMubmEoeCkpICkgXQ0KDQojU2V0IG51bWVyaWMgY29sdW1uIGNsYXNzDQpjdXJlLmRhdGEgPC0gY3VyZS5kYXRhICU+JSBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLGFzLmZhY3RvcikNCiNBZGQgYmFjayByb3duYW1lcw0KDQpyb3duYW1lcyhjdXJlLmRhdGEpIDwtIHJvd25hbWVzDQoNCiNjdXJlLmRhdGEgPC0gY3VyZS5kYXRhICU+JSBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBhcy5udW1lcmljKQ0KDQpYOC5ub25yYXJlZmllZCA9IHQoaW1wb3J0Lm90dS50YWJsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMlJSUgbm9uLXJhcmVmaWVkDQoNCg0KIyMjcmFyZWZ5aW5nfHN1YnNhbXBsaW5nIHJlYWRzIGluIGV2ZXJ5IHNhbXBsZQ0KYmFycGxvdChjb2xTdW1zKGltcG9ydC5vdHUudGFibGUpKQ0KbWluKGNvbFN1bXMoaW1wb3J0Lm90dS50YWJsZSkpDQoNCnJhcmU4IDwtIHQoaW1wb3J0Lm90dS50YWJsZSkNCiNyYXJlOCA9IHJhcmVmeSh0KGltcG9ydC5vdHUudGFibGUpLCBzYW1wbGUgPSA0NTAwMDApDQpYOC5yYXJlZmllZCA9IGFzLmRhdGEuZnJhbWUocmFyZTgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMlJSUgcmFyZWZpZWQNCg0KIyMjU3Vic2V0IG1ldGFkYXRhIHRvIG1hdGNoIHJlbWFpbmluZyBzYW1wbGVzIGFmdGVyIHJhcmVmYWN0aW9uDQoNClkuYWxsID0gY3VyZS5kYXRhW3Jvd25hbWVzKFg4LnJhcmVmaWVkKSxdDQoNCiMjI0xvZyB0cmFuZm9ybWF0aW9uDQpYID0gbG9nMTAoWDgucmFyZWZpZWQrMSkNCg0KI1NlbGVjdCByZWxldmFudCBudW1lcmljIGNvbHVtbg0KDQpZIDwtIGRwbHlyOjpzZWxlY3QoWS5hbGwsYygiVHdpbl9wYWlycyIsICJEYXlzIiwgIkdlc3RhdGlvbmFsX2FnZSIsICJCaXJ0aF93ZWlnaHQiLCAiU21hbGxfZm9yX2dlc3RhdGlvbmFsX2FnZSIsICJBbnRlbmF0YWxfc3Rlcm9pZHMiICwgIkRlbGl2ZXJ5X21vZGUiLCAiSW50cmFwYXJ0dW1fYW50aWJpb3RpY19wcm9waHlsYXhpcyIsICJMYXRlX29uc2V0X3NlcHNpcyIgLCAiTmVjcm90aXppbmdfZW50ZXJvY29saXRpcyIsICJQYXRlbnRfZHVjdHVzX2FydGVyaW9zdXMiLCAiQnJvbmNob3B1bG1vbmFyeV9keXNwbGFzaWEiLCAiQW50aWJpb3RpY3NfYXRfYmlydGgiLCAiVG90YWxfZGF5c19hbnRpYmlvdGljc190aGVyYXB5IikpDQoNCiNjb2xuYW1lcyhZKSAjQ2hlY2sgcmVtYWluaW5nIGNvbHVtbnMNCg0KIyMjU2VsZWN0IG9ubHkgbnVtZXJpYyBtZXRhZGF0YSBjdWx1bW5zDQoNCiNZICA8LSBZICU+JSBtdXRhdGVfYWxsKGFzLm51bWVyaWMpDQoNCiNjb2xuYW1lcyhZKSAjQ2hlY2sgcmVtYWluaW5nIGNvbHVtbnMNCg0KIyN2aWZjb3INCiNjb2xsaW5lYXJpdHkgPC0gdmlmY29yKFksIHRoICA9MC41KSAjYXQgMC41IHRocmVzaG9sZCB2YXJpYWJsZXMgaGF2ZSBhIFZJRiBiZWxvdyAxMC4wMCAoPDAuMjEgY29ycmVsYXRpb24hKQ0KI2NvbGxpbmVhcml0eQ0KDQojU2VsZWN0IHJlbGV2YW50IGNvbHVtbnMgZm9yIHRoYXQgYXJlIG5vbi1jb2xsaW5lYXINCg0KWS5hZCA9IFkNCiNZLmFkIDwtIGRwbHlyOjpzZWxlY3QoWS5hbGwsYygiQmF0Y2giLCAiVGltZSIpDQoNCiNZLmFkIDwtIFkuYWxsWzg6MjNdDQoNCiNSZW1vdmUgTkEgcm93cw0KDQpZLmFkIDwtIFkuYWQgJT4lIGRyb3BfbmEoKQ0KDQpYLmFkIDwtIFhbcm93bmFtZXMoWS5hZCksXQ0KDQojaXMubmEoWS5hZCkNCg0KIyNTdWJzZXQgZWFjaCB0aW1lIHBvaW50DQojIyMgMA0KWS4wIDwtIGRwbHlyOjpmaWx0ZXIoWS5hZCwgRGF5cyA9PSAiIDEiKQ0KWC4wIDwtIFhbcm93bmFtZXMoWS4wKSxdDQojIyMgMTUNClkuMTUgPC0gZHBseXI6OmZpbHRlcihZLmFkLCBEYXlzID09ICIxNSIpDQpYLjE1IDwtIFhbcm93bmFtZXMoWS4xNSksXQ0KDQojIyMgMzANClkuMzAgPC0gZHBseXI6OmZpbHRlcihZLmFkLCBEYXlzID09ICIzMCIpDQpYLjMwIDwtIFhbcm93bmFtZXMoWS4zMCksXQ0KDQojIyMgOTANClkuOTAgPC0gZHBseXI6OmZpbHRlcihZLmFkLCBEYXlzID09ICI5MCIpDQpYLjkwIDwtIFhbcm93bmFtZXMoWS45MCksXQ0KYGBgDQoNCiMjIyBEYiBhbm92YSAtIGNvbnN0cmFpbmVkIGZvciB0aW1lIHBvaW50DQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9DQojIyMjIyMjIyMjIyMjI0Fub3ZhIG9uIGNhcHNjYWxlIC0gYWxsIHZhcmlhYmxlcw0KDQphbm92YS5tIDwtIG1hdHJpeChucm93ID0gMCwgbmNvbCA9NikgI0NyZWF0ZSBtYXRyaXggZm9yIHJlc3VsdHMNCmNvbG5hbWVzKGFub3ZhLm0pIDwtIGMoIkRmIiwiU3VtT2ZTcXMiLCJGIiwiUHIuRiIsIlJlc2lkdWFsLkRmIiwiUmVzaWR1YWwuU3VtT2ZTcXMiKSAgICAgICAgICAgICAgICANCmZvciAoaSBpbiBjb2xuYW1lcyhkcGx5cjo6c2VsZWN0KFkuYWQsLWMoIkRheXMiKSkpKXsNCiAgYW5vdmEgPC0gYXMubWF0cml4KGFub3ZhLmNjYShjYXBzY2FsZShYLmFkIH4gWS5hZFssaV0gKyBDb25kaXRpb24oRGF5cyksIFkuYWQsIGRpc3QgPSAiYnJheSIpLHBlcm11dGF0aW9ucyA9IGhvdyhucGVybT05OTk5KSkpDQogIGFub3ZhIDwtIGMoYW5vdmFbMSxdLGFub3ZhWzIsMToyXSkNCiAgYW5vdmEubSA8LXJiaW5kKGFub3ZhLm0sYW5vdmEpDQp9DQoNCnJvd25hbWVzKGFub3ZhLm0pIDwtIGNvbG5hbWVzKGRwbHlyOjpzZWxlY3QoWS5hZCwtYygiRGF5cyIpKSkNCg0KI1ByZXBhcmUgZm9yIHBsb3R0aW5nDQoNCmFub3ZhLmRhdCA8LSBhbm92YS5tICU+JQ0KICBhcy5kYXRhLmZyYW1lKCkgJT4lDQogIHRpYmJsZTo6YWRkX2NvbHVtbihWYXJpYWJsZSA9IHJvd25hbWVzKGFub3ZhLm0pLC5uYW1lX3JlcGFpciA9ICJtaW5pbWFsIikNCg0KI0FkZCBhZGp1c3RlZCBwLXZhbHVlcw0KYW5vdmEuZGF0JFByLkYuYWRqIDwtIHAuYWRqdXN0KGFub3ZhLmRhdCRQci5GLCBtZXRob2QgPSAnaG9sbScpDQoNCiNTaG93IHRhYmxlDQoja25pdHI6OmthYmxlKGFub3ZhLmRhdCkNCg0KI0NhbGN1bGF0ZSBzdW0gb2Ygc3F1YXJlcw0KYW5vdmEuZGF0JFIyIDwtIGFub3ZhLmRhdCRTdW1PZlNxcyAvIChhbm92YS5kYXQkU3VtT2ZTcXMgKyBhbm92YS5kYXQkUmVzaWR1YWwuU3VtT2ZTcXMpDQoNCiMjRmFuY3kgcGxvdA0KDQphbm92YS5tZWx0IDwtIHRpZHlyOjpwaXZvdF9sb25nZXIoYW5vdmEuZGF0LGNvbHM9YygiUjIiKSwgbmFtZXNfdG89J21lYXN1cmUnLCB2YWx1ZXNfdG89InZhbHVlIikgJT4lDQogIGFkZF9zaWduaWZpY2FuY2UocC5jb2wgPSAiUHIuRi5hZGoiLCBvdXRwdXQuY29sID0gIlByRi5zeW0iLA0KICAgICAgICAgICAgICAgICAgIGN1dHBvaW50cyA9IGMoMCwgMWUtMDQsIDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEsMSksDQogICAgICAgICAgICAgICAgICAgc3ltYm9scyA9IGMoIioqKioiLCAiKioqIiwgIioqIiwgIioiLCAiXHUwMkQ5IiwgIiIpDQogICAgICAgICAgICAgICAgICAgKSAlPiUNCiAgYXJyYW5nZSh2YWx1ZSkNCg0KYW5vdmEubWVsdC52aXIgPC0gYW5vdmEubWVsdCAlPiUgbXV0YXRlKFZhcmlhYmxlID0gZ3N1YigiXyIsICIgIixWYXJpYWJsZSkpDQoNCmZhbmN5LmFub3ZhLmJhci52aXIgPC0gZ2diYXJwbG90KGFub3ZhLm1lbHQudmlyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4PSJWYXJpYWJsZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9InZhbHVlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NvbG9yID0gIlZhcmlhYmxlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24gPSBjKCJob3Jpem9udGFsIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gTkEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSAibWVhc3VyZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gYW5vdmEubWVsdCRQckYuc3ltLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWIuc2l6ZSA9IDksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYi52anVzdCA9IDAuNywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiLmhqdXN0ID0gLTAuMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCikgKw0KICAjc3RhdF9wdmFsdWVfbWFudWFsKA0KICAjICBhZG9uaXMubWVsdCwgIGxhYmVsID0gIlByRi5zeW0iLCB0aXAubGVuZ3RoID0gMC4wMQ0KICAjKSArDQogICNnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjA1KSArDQogIGdndGl0bGUoIkNhcHNjYWxlIGRiUkRBIGVmZmVjdCBzaXplOiBhbGwgdmFyaWFibGVzIikgKw0KICB5bGFiKGV4cHJlc3Npb24oUl4yfiJ2YWx1ZSIpKSArDQogIHNjYWxlX2ZpbGxfamNvKCkNCg0KZmFuY3kuYW5vdmEuYmFyLnZpcg0KYGBgDQoNCg0KIyMgSG9zdCB2aXJvbWUNCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGfQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNJbXBvcnRpbmctRGF0YQ0KDQojIHN0YW5kZiA9IGZ1bmN0aW9uKHgsIHQ9dG90YWwpIHJvdW5kKHQgKiAoeCAvIHN1bSh4KSkpDQojIHRvdGFsID0gbWVkaWFuKHNhbXBsZV9zdW1zKFBTVikpDQojIFBTVi5ob3N0LlJBID0gdHJhbnNmb3JtX3NhbXBsZV9jb3VudHMoUFNWLmhvc3QsIHN0YW5kZikNCg0KaW1wb3J0Lm90dS50YWJsZSA8LSBhcy5kYXRhLmZyYW1lKG90dV90YWJsZShQU1YuaG9zdCkpICU+JQ0KICAjZHBseXI6OnNlbGVjdCgtdGF4b25vbXkpICU+JQ0KICBtdXRhdGVfYWxsKGFzLm51bWVyaWMpICNDb252ZXJ0IHRvIG51bWVyaWMgd2hlcmUgcG9zc2libGUgDQoNCmN1cmUuZGF0YSA9IG1ldGEudmlyDQoNCiNpbXBvcnQudGF4b25vbXkgPSByZWFkLnRhYmxlKCd2aXJvbWVfdGF4b25vbXlfTENBX2tub3duLnR4dCcsIGhlYWRlciA9IFQpDQoNCnJvd25hbWVzIDwtIHJvd25hbWVzKGN1cmUuZGF0YSkNCg0KI1JlbW92ZSBOQSBjb2xvbW5zDQoNCmN1cmUuZGF0YSA8LSBjdXJlLmRhdGFbICwgISBhcHBseSggY3VyZS5kYXRhICwgMiAsIGZ1bmN0aW9uKHgpIGFsbChpcy5uYSh4KSkgKSBdDQoNCiNTZXQgbnVtZXJpYyBjb2x1bW4gY2xhc3MNCmN1cmUuZGF0YSA8LSBjdXJlLmRhdGEgJT4lIG11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsYXMuZmFjdG9yKQ0KI0FkZCBiYWNrIHJvd25hbWVzDQoNCnJvd25hbWVzKGN1cmUuZGF0YSkgPC0gcm93bmFtZXMNCg0KI2N1cmUuZGF0YSA8LSBjdXJlLmRhdGEgJT4lIG11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsIGFzLm51bWVyaWMpDQoNClg4Lm5vbnJhcmVmaWVkID0gdChpbXBvcnQub3R1LnRhYmxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyUlJSBub24tcmFyZWZpZWQNCg0KDQojIyNyYXJlZnlpbmd8c3Vic2FtcGxpbmcgcmVhZHMgaW4gZXZlcnkgc2FtcGxlDQpiYXJwbG90KGNvbFN1bXMoaW1wb3J0Lm90dS50YWJsZSkpDQptaW4oY29sU3VtcyhpbXBvcnQub3R1LnRhYmxlKSkNCg0KcmFyZTggPC0gdChpbXBvcnQub3R1LnRhYmxlKQ0KI3JhcmU4ID0gcmFyZWZ5KHQoaW1wb3J0Lm90dS50YWJsZSksIHNhbXBsZSA9IDQ1MDAwMCkNClg4LnJhcmVmaWVkID0gYXMuZGF0YS5mcmFtZShyYXJlOCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyUlJSByYXJlZmllZA0KDQojIyNTdWJzZXQgbWV0YWRhdGEgdG8gbWF0Y2ggcmVtYWluaW5nIHNhbXBsZXMgYWZ0ZXIgcmFyZWZhY3Rpb24NCg0KWS5hbGwgPSBjdXJlLmRhdGFbcm93bmFtZXMoWDgucmFyZWZpZWQpLF0NCg0KIyMjTG9nIHRyYW5mb3JtYXRpb24NClggPSBsb2cxMChYOC5yYXJlZmllZCsxKQ0KDQojU2VsZWN0IHJlbGV2YW50IG51bWVyaWMgY29sdW1uDQoNClkgPC0gZHBseXI6OnNlbGVjdChZLmFsbCxjKCJUd2luX3BhaXJzIiwgIkRheXMiLCAiR2VzdGF0aW9uYWxfYWdlIiwgIkJpcnRoX3dlaWdodCIsICJTbWFsbF9mb3JfZ2VzdGF0aW9uYWxfYWdlIiwgIkFudGVuYXRhbF9zdGVyb2lkcyIgLCAiRGVsaXZlcnlfbW9kZSIsICJJbnRyYXBhcnR1bV9hbnRpYmlvdGljX3Byb3BoeWxheGlzIiwgIkxhdGVfb25zZXRfc2Vwc2lzIiAsICJOZWNyb3RpemluZ19lbnRlcm9jb2xpdGlzIiwgIlBhdGVudF9kdWN0dXNfYXJ0ZXJpb3N1cyIsICJCcm9uY2hvcHVsbW9uYXJ5X2R5c3BsYXNpYSIsICJBbnRpYmlvdGljc19hdF9iaXJ0aCIsICJUb3RhbF9kYXlzX2FudGliaW90aWNzX3RoZXJhcHkiKSkNCg0KI2NvbG5hbWVzKFkpICNDaGVjayByZW1haW5pbmcgY29sdW1ucw0KDQojIyNTZWxlY3Qgb25seSBudW1lcmljIG1ldGFkYXRhIGN1bHVtbnMNCg0KI1kgIDwtIFkgJT4lIG11dGF0ZV9hbGwoYXMubnVtZXJpYykNCg0KI2NvbG5hbWVzKFkpICNDaGVjayByZW1haW5pbmcgY29sdW1ucw0KDQojI3ZpZmNvcg0KI2NvbGxpbmVhcml0eSA8LSB2aWZjb3IoWSwgdGggID0wLjUpICNhdCAwLjUgdGhyZXNob2xkIHZhcmlhYmxlcyBoYXZlIGEgVklGIGJlbG93IDEwLjAwICg8MC4yMSBjb3JyZWxhdGlvbiEpDQojY29sbGluZWFyaXR5DQoNCiNTZWxlY3QgcmVsZXZhbnQgY29sdW1ucyBmb3IgdGhhdCBhcmUgbm9uLWNvbGxpbmVhcg0KDQpZLmFkID0gWQ0KI1kuYWQgPC0gZHBseXI6OnNlbGVjdChZLmFsbCxjKCJCYXRjaCIsICJUaW1lIikNCg0KI1kuYWQgPC0gWS5hbGxbODoyM10NCg0KI1JlbW92ZSBOQSByb3dzDQoNClkuYWQgPC0gWS5hZCAlPiUgZHJvcF9uYSgpDQoNClguYWQgPC0gWFtyb3duYW1lcyhZLmFkKSxdDQoNCiNpcy5uYShZLmFkKQ0KDQojI1N1YnNldCBlYWNoIHRpbWUgcG9pbnQNCiMjIyAwDQpZLjAgPC0gZHBseXI6OmZpbHRlcihZLmFkLCBEYXlzID09ICIgMSIpDQpYLjAgPC0gWFtyb3duYW1lcyhZLjApLF0NCiMjIyAxNQ0KWS4xNSA8LSBkcGx5cjo6ZmlsdGVyKFkuYWQsIERheXMgPT0gIjE1IikNClguMTUgPC0gWFtyb3duYW1lcyhZLjE1KSxdDQoNCiMjIyAzMA0KWS4zMCA8LSBkcGx5cjo6ZmlsdGVyKFkuYWQsIERheXMgPT0gIjMwIikNClguMzAgPC0gWFtyb3duYW1lcyhZLjMwKSxdDQoNCiMjIyA5MA0KWS45MCA8LSBkcGx5cjo6ZmlsdGVyKFkuYWQsIERheXMgPT0gIjkwIikNClguOTAgPC0gWFtyb3duYW1lcyhZLjkwKSxdDQpgYGANCg0KIyMjIERiIGFub3ZhIC0gY29uc3RyYWluZWQgZm9yIHRpbWUgcG9pbnQNCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gIEYsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD00LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0NCiMjIyMjIyMjIyMjIyMjQW5vdmEgb24gY2Fwc2NhbGUgLSBhbGwgdmFyaWFibGVzDQoNCmFub3ZhLm0gPC0gbWF0cml4KG5yb3cgPSAwLCBuY29sID02KSAjQ3JlYXRlIG1hdHJpeCBmb3IgcmVzdWx0cw0KY29sbmFtZXMoYW5vdmEubSkgPC0gYygiRGYiLCJTdW1PZlNxcyIsIkYiLCJQci5GIiwiUmVzaWR1YWwuRGYiLCJSZXNpZHVhbC5TdW1PZlNxcyIpICAgICAgICAgICAgICAgIA0KZm9yIChpIGluIGNvbG5hbWVzKGRwbHlyOjpzZWxlY3QoWS5hZCwtYygiRGF5cyIpKSkpew0KICBhbm92YSA8LSBhcy5tYXRyaXgoYW5vdmEuY2NhKGNhcHNjYWxlKFguYWQgfiBZLmFkWyxpXSArIENvbmRpdGlvbihEYXlzKSwgWS5hZCwgZGlzdCA9ICJicmF5IikscGVybXV0YXRpb25zID0gaG93KG5wZXJtPTk5OTkpKSkNCiAgYW5vdmEgPC0gYyhhbm92YVsxLF0sYW5vdmFbMiwxOjJdKQ0KICBhbm92YS5tIDwtcmJpbmQoYW5vdmEubSxhbm92YSkNCn0NCg0Kcm93bmFtZXMoYW5vdmEubSkgPC0gY29sbmFtZXMoZHBseXI6OnNlbGVjdChZLmFkLC1jKCJEYXlzIikpKQ0KDQojUHJlcGFyZSBmb3IgcGxvdHRpbmcNCg0KYW5vdmEuZGF0IDwtIGFub3ZhLm0gJT4lDQogIGFzLmRhdGEuZnJhbWUoKSAlPiUNCiAgdGliYmxlOjphZGRfY29sdW1uKFZhcmlhYmxlID0gcm93bmFtZXMoYW5vdmEubSksLm5hbWVfcmVwYWlyID0gIm1pbmltYWwiKQ0KDQojQWRkIGFkanVzdGVkIHAtdmFsdWVzDQphbm92YS5kYXQkUHIuRi5hZGogPC0gcC5hZGp1c3QoYW5vdmEuZGF0JFByLkYsIG1ldGhvZCA9ICdob2xtJykNCg0KI1Nob3cgdGFibGUNCiNrbml0cjo6a2FibGUoYW5vdmEuZGF0KQ0KDQojQ2FsY3VsYXRlIHN1bSBvZiBzcXVhcmVzDQphbm92YS5kYXQkUjIgPC0gYW5vdmEuZGF0JFN1bU9mU3FzIC8gKGFub3ZhLmRhdCRTdW1PZlNxcyArIGFub3ZhLmRhdCRSZXNpZHVhbC5TdW1PZlNxcykNCg0KIyNGYW5jeSBwbG90DQoNCmFub3ZhLm1lbHQgPC0gdGlkeXI6OnBpdm90X2xvbmdlcihhbm92YS5kYXQsY29scz1jKCJSMiIpLCBuYW1lc190bz0nbWVhc3VyZScsIHZhbHVlc190bz0idmFsdWUiKSAlPiUNCiAgYWRkX3NpZ25pZmljYW5jZShwLmNvbCA9ICJQci5GLmFkaiIsIG91dHB1dC5jb2wgPSAiUHJGLnN5bSIsDQogICAgICAgICAgICAgICAgICAgY3V0cG9pbnRzID0gYygwLCAxZS0wNCwgMC4wMDEsIDAuMDEsIDAuMDUsIDAuMSwxKSwNCiAgICAgICAgICAgICAgICAgICBzeW1ib2xzID0gYygiKioqKiIsICIqKioiLCAiKioiLCAiKiIsICJcdTAyRDkiLCAiIikNCiAgICAgICAgICAgICAgICAgICApICU+JQ0KICBhcnJhbmdlKHZhbHVlKQ0KDQphbm92YS5tZWx0LnZpci5ob3N0IDwtIGFub3ZhLm1lbHQgJT4lIG11dGF0ZShWYXJpYWJsZSA9IGdzdWIoIl8iLCAiICIsVmFyaWFibGUpKQ0KDQpmYW5jeS5hbm92YS5iYXIudmlyLmhvc3QgPC0gZ2diYXJwbG90KGFub3ZhLm1lbHQudmlyLmhvc3QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg9IlZhcmlhYmxlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeT0idmFsdWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjY29sb3IgPSAiVmFyaWFibGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IGMoImhvcml6b250YWwiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBOQSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJtZWFzdXJlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBhbm92YS5tZWx0JFByRi5zeW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYi5zaXplID0gOSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiLnZqdXN0ID0gMC43LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWIuaGp1c3QgPSAtMC4zDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKSArDQogICNzdGF0X3B2YWx1ZV9tYW51YWwoDQogICMgIGFkb25pcy5tZWx0LCAgbGFiZWwgPSAiUHJGLnN5bSIsIHRpcC5sZW5ndGggPSAwLjAxDQogICMpICsNCiAgI2dlb21faGxpbmUoeWludGVyY2VwdCA9IDAuMDUpICsNCiAgZ2d0aXRsZSgiQ2Fwc2NhbGUgZGJSREEgZWZmZWN0IHNpemU6IGFsbCB2YXJpYWJsZXMiKSArDQogIHlsYWIoZXhwcmVzc2lvbihSXjJ+InZhbHVlIikpICsNCiAgc2NhbGVfZmlsbF9qY28oKQ0KDQpmYW5jeS5hbm92YS5iYXIudmlyLmhvc3QNCmBgYA0KDQojIyBIb3N0IHZpcm9tZSAtIEdlbnVzDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRn0NCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjSW1wb3J0aW5nLURhdGENCg0KIyBzdGFuZGYgPSBmdW5jdGlvbih4LCB0PXRvdGFsKSByb3VuZCh0ICogKHggLyBzdW0oeCkpKQ0KIyB0b3RhbCA9IG1lZGlhbihzYW1wbGVfc3VtcyhQU1YpKQ0KIyBQU1YuaG9zdC5SQSA9IHRyYW5zZm9ybV9zYW1wbGVfY291bnRzKFBTVi5ob3N0LCBzdGFuZGYpDQoNClBTVi5DU1MuaG9zdC5nZW51cyA8LSB0YXhfZ2xvbShQU1YuaG9zdCx0YXhyYW5rID0gIkdlbnVzIikNCg0KaW1wb3J0Lm90dS50YWJsZSA8LSBhcy5kYXRhLmZyYW1lKG90dV90YWJsZShQU1YuQ1NTLmhvc3QuZ2VudXMpKSAlPiUNCiAgI2RwbHlyOjpzZWxlY3QoLXRheG9ub215KSAlPiUNCiAgbXV0YXRlX2FsbChhcy5udW1lcmljKSAjQ29udmVydCB0byBudW1lcmljIHdoZXJlIHBvc3NpYmxlIA0KDQpjdXJlLmRhdGEgPSBtZXRhLnZpcg0KDQojaW1wb3J0LnRheG9ub215ID0gcmVhZC50YWJsZSgndmlyb21lX3RheG9ub215X0xDQV9rbm93bi50eHQnLCBoZWFkZXIgPSBUKQ0KDQpyb3duYW1lcyA8LSByb3duYW1lcyhjdXJlLmRhdGEpDQoNCiNSZW1vdmUgTkEgY29sb21ucw0KDQpjdXJlLmRhdGEgPC0gY3VyZS5kYXRhWyAsICEgYXBwbHkoIGN1cmUuZGF0YSAsIDIgLCBmdW5jdGlvbih4KSBhbGwoaXMubmEoeCkpICkgXQ0KDQojU2V0IG51bWVyaWMgY29sdW1uIGNsYXNzDQpjdXJlLmRhdGEgPC0gY3VyZS5kYXRhICU+JSBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLGFzLmZhY3RvcikNCiNBZGQgYmFjayByb3duYW1lcw0KDQpyb3duYW1lcyhjdXJlLmRhdGEpIDwtIHJvd25hbWVzDQoNCiNjdXJlLmRhdGEgPC0gY3VyZS5kYXRhICU+JSBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBhcy5udW1lcmljKQ0KDQpYOC5ub25yYXJlZmllZCA9IHQoaW1wb3J0Lm90dS50YWJsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMlJSUgbm9uLXJhcmVmaWVkDQoNCg0KIyMjcmFyZWZ5aW5nfHN1YnNhbXBsaW5nIHJlYWRzIGluIGV2ZXJ5IHNhbXBsZQ0KYmFycGxvdChjb2xTdW1zKGltcG9ydC5vdHUudGFibGUpKQ0KbWluKGNvbFN1bXMoaW1wb3J0Lm90dS50YWJsZSkpDQoNCnJhcmU4IDwtIHQoaW1wb3J0Lm90dS50YWJsZSkNCiNyYXJlOCA9IHJhcmVmeSh0KGltcG9ydC5vdHUudGFibGUpLCBzYW1wbGUgPSA0NTAwMDApDQpYOC5yYXJlZmllZCA9IGFzLmRhdGEuZnJhbWUocmFyZTgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMlJSUgcmFyZWZpZWQNCg0KIyMjU3Vic2V0IG1ldGFkYXRhIHRvIG1hdGNoIHJlbWFpbmluZyBzYW1wbGVzIGFmdGVyIHJhcmVmYWN0aW9uDQoNClkuYWxsID0gY3VyZS5kYXRhW3Jvd25hbWVzKFg4LnJhcmVmaWVkKSxdDQoNCiMjI0xvZyB0cmFuZm9ybWF0aW9uDQpYID0gbG9nMTAoWDgucmFyZWZpZWQrMSkNCg0KI1NlbGVjdCByZWxldmFudCBudW1lcmljIGNvbHVtbg0KDQpZIDwtIGRwbHlyOjpzZWxlY3QoWS5hbGwsYygiVHdpbl9wYWlycyIsICJEYXlzIiwgIkdlc3RhdGlvbmFsX2FnZSIsICJCaXJ0aF93ZWlnaHQiLCAiU21hbGxfZm9yX2dlc3RhdGlvbmFsX2FnZSIsICJBbnRlbmF0YWxfc3Rlcm9pZHMiICwgIkRlbGl2ZXJ5X21vZGUiLCAiSW50cmFwYXJ0dW1fYW50aWJpb3RpY19wcm9waHlsYXhpcyIsICJMYXRlX29uc2V0X3NlcHNpcyIgLCAiTmVjcm90aXppbmdfZW50ZXJvY29saXRpcyIsICJQYXRlbnRfZHVjdHVzX2FydGVyaW9zdXMiLCAiQnJvbmNob3B1bG1vbmFyeV9keXNwbGFzaWEiLCAiQW50aWJpb3RpY3NfYXRfYmlydGgiLCAiVG90YWxfZGF5c19hbnRpYmlvdGljc190aGVyYXB5IikpDQoNCmNvbG5hbWVzKFkpICNDaGVjayByZW1haW5pbmcgY29sdW1ucw0KDQojIyNTZWxlY3Qgb25seSBudW1lcmljIG1ldGFkYXRhIGN1bHVtbnMNCg0KI1kgIDwtIFkgJT4lIG11dGF0ZV9hbGwoYXMubnVtZXJpYykNCg0KI2NvbG5hbWVzKFkpICNDaGVjayByZW1haW5pbmcgY29sdW1ucw0KDQojI3ZpZmNvcg0KI2NvbGxpbmVhcml0eSA8LSB2aWZjb3IoWSwgdGggID0wLjUpICNhdCAwLjUgdGhyZXNob2xkIHZhcmlhYmxlcyBoYXZlIGEgVklGIGJlbG93IDEwLjAwICg8MC4yMSBjb3JyZWxhdGlvbiEpDQojY29sbGluZWFyaXR5DQoNCiNTZWxlY3QgcmVsZXZhbnQgY29sdW1ucyBmb3IgdGhhdCBhcmUgbm9uLWNvbGxpbmVhcg0KDQpZLmFkID0gWQ0KI1kuYWQgPC0gZHBseXI6OnNlbGVjdChZLmFsbCxjKCJCYXRjaCIsICJUaW1lIikNCg0KI1kuYWQgPC0gWS5hbGxbODoyM10NCg0KI1JlbW92ZSBOQSByb3dzDQoNClkuYWQgPC0gWS5hZCAlPiUgZHJvcF9uYSgpDQoNClguYWQgPC0gWFtyb3duYW1lcyhZLmFkKSxdDQoNCiNpcy5uYShZLmFkKQ0KDQojI1N1YnNldCBlYWNoIHRpbWUgcG9pbnQNCiMjIyAwDQpZLjAgPC0gZHBseXI6OmZpbHRlcihZLmFkLCBEYXlzID09ICIgMSIpDQpYLjAgPC0gWFtyb3duYW1lcyhZLjApLF0NCiMjIyAxNQ0KWS4xNSA8LSBkcGx5cjo6ZmlsdGVyKFkuYWQsIERheXMgPT0gIjE1IikNClguMTUgPC0gWFtyb3duYW1lcyhZLjE1KSxdDQoNCiMjIyAzMA0KWS4zMCA8LSBkcGx5cjo6ZmlsdGVyKFkuYWQsIERheXMgPT0gIjMwIikNClguMzAgPC0gWFtyb3duYW1lcyhZLjMwKSxdDQoNCiMjIyA5MA0KWS45MCA8LSBkcGx5cjo6ZmlsdGVyKFkuYWQsIERheXMgPT0gIjkwIikNClguOTAgPC0gWFtyb3duYW1lcyhZLjkwKSxdDQpgYGANCg0KIyMjIERiIGFub3ZhIC0gY29uc3RyYWluZWQgZm9yIHRpbWUgcG9pbnQNCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gIEYsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD00LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0NCiMjIyMjIyMjIyMjIyMjQW5vdmEgb24gY2Fwc2NhbGUgLSBhbGwgdmFyaWFibGVzDQoNCmFub3ZhLm0gPC0gbWF0cml4KG5yb3cgPSAwLCBuY29sID02KSAjQ3JlYXRlIG1hdHJpeCBmb3IgcmVzdWx0cw0KY29sbmFtZXMoYW5vdmEubSkgPC0gYygiRGYiLCJTdW1PZlNxcyIsIkYiLCJQci5GIiwiUmVzaWR1YWwuRGYiLCJSZXNpZHVhbC5TdW1PZlNxcyIpICAgICAgICAgICAgICAgIA0KZm9yIChpIGluIGNvbG5hbWVzKGRwbHlyOjpzZWxlY3QoWS5hZCwtYygiRGF5cyIpKSkpew0KICBhbm92YSA8LSBhcy5tYXRyaXgoYW5vdmEuY2NhKGNhcHNjYWxlKFguYWQgfiBZLmFkWyxpXSArIENvbmRpdGlvbihEYXlzKSwgWS5hZCwgZGlzdCA9ICJicmF5IikscGVybXV0YXRpb25zID0gaG93KG5wZXJtPTk5OTkpKSkNCiAgYW5vdmEgPC0gYyhhbm92YVsxLF0sYW5vdmFbMiwxOjJdKQ0KICBhbm92YS5tIDwtcmJpbmQoYW5vdmEubSxhbm92YSkNCn0NCg0Kcm93bmFtZXMoYW5vdmEubSkgPC0gY29sbmFtZXMoZHBseXI6OnNlbGVjdChZLmFkLC1jKCJEYXlzIikpKQ0KDQojUHJlcGFyZSBmb3IgcGxvdHRpbmcNCg0KYW5vdmEuZGF0IDwtIGFub3ZhLm0gJT4lDQogIGFzLmRhdGEuZnJhbWUoKSAlPiUNCiAgdGliYmxlOjphZGRfY29sdW1uKFZhcmlhYmxlID0gcm93bmFtZXMoYW5vdmEubSksLm5hbWVfcmVwYWlyID0gIm1pbmltYWwiKQ0KDQojQWRkIGFkanVzdGVkIHAtdmFsdWVzDQphbm92YS5kYXQkUHIuRi5hZGogPC0gcC5hZGp1c3QoYW5vdmEuZGF0JFByLkYsIG1ldGhvZCA9ICdob2xtJykNCg0KI1Nob3cgdGFibGUNCiNrbml0cjo6a2FibGUoYW5vdmEuZGF0KQ0KDQojQ2FsY3VsYXRlIHN1bSBvZiBzcXVhcmVzDQphbm92YS5kYXQkUjIgPC0gYW5vdmEuZGF0JFN1bU9mU3FzIC8gKGFub3ZhLmRhdCRTdW1PZlNxcyArIGFub3ZhLmRhdCRSZXNpZHVhbC5TdW1PZlNxcykNCg0KIyNGYW5jeSBwbG90DQoNCmFub3ZhLm1lbHQgPC0gdGlkeXI6OnBpdm90X2xvbmdlcihhbm92YS5kYXQsY29scz1jKCJSMiIpLCBuYW1lc190bz0nbWVhc3VyZScsIHZhbHVlc190bz0idmFsdWUiKSAlPiUNCiAgYWRkX3NpZ25pZmljYW5jZShwLmNvbCA9ICJQci5GLmFkaiIsIG91dHB1dC5jb2wgPSAiUHJGLnN5bSIsDQogICAgICAgICAgICAgICAgICAgY3V0cG9pbnRzID0gYygwLCAxZS0wNCwgMC4wMDEsIDAuMDEsIDAuMDUsIDAuMSwxKSwNCiAgICAgICAgICAgICAgICAgICBzeW1ib2xzID0gYygiKioqKiIsICIqKioiLCAiKioiLCAiKiIsICJcdTAyRDkiLCAiIikNCiAgICAgICAgICAgICAgICAgICApICU+JQ0KICBhcnJhbmdlKHZhbHVlKQ0KDQphbm92YS5tZWx0LnZpci5ob3N0IDwtIGFub3ZhLm1lbHQgJT4lIG11dGF0ZShWYXJpYWJsZSA9IGdzdWIoIl8iLCAiICIsVmFyaWFibGUpKQ0KDQpmYW5jeS5hbm92YS5iYXIudmlyLmhvc3QgPC0gZ2diYXJwbG90KGFub3ZhLm1lbHQudmlyLmhvc3QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg9IlZhcmlhYmxlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeT0idmFsdWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjY29sb3IgPSAiVmFyaWFibGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IGMoImhvcml6b250YWwiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBOQSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJtZWFzdXJlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBhbm92YS5tZWx0JFByRi5zeW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYi5zaXplID0gOSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiLnZqdXN0ID0gMC43LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWIuaGp1c3QgPSAtMC4zDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKSArDQogICNzdGF0X3B2YWx1ZV9tYW51YWwoDQogICMgIGFkb25pcy5tZWx0LCAgbGFiZWwgPSAiUHJGLnN5bSIsIHRpcC5sZW5ndGggPSAwLjAxDQogICMpICsNCiAgI2dlb21faGxpbmUoeWludGVyY2VwdCA9IDAuMDUpICsNCiAgZ2d0aXRsZSgiQ2Fwc2NhbGUgZGJSREEgZWZmZWN0IHNpemU6IGFsbCB2YXJpYWJsZXMiKSArDQogIHlsYWIoZXhwcmVzc2lvbihSXjJ+InZhbHVlIikpICsNCiAgc2NhbGVfZmlsbF9qY28oKQ0KDQpmYW5jeS5hbm92YS5iYXIudmlyLmhvc3QNCmBgYA0KDQojIyBDb21iaW5lZCBlZmZlY3Qgc2l6ZSBwbG90cw0KDQojIyMgV2l0aCB2aXJhbCBob3N0cw0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgbWVzc2FnZSA9IEYsIHdhcm5pbmcgPSAgRiwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9Nn0NCmFub3ZhLm1lbHQuYmFjJENvbW11bml0eSA8LSAiQmFjdGVyaWEiDQphbm92YS5tZWx0LnZpciRDb21tdW5pdHkgPC0gIlZpcmEiDQphbm92YS5tZWx0LnZpci5ob3N0JENvbW11bml0eSA8LSAiVmlyYWwgaG9zdCINCg0KIyBSZW5hbWUgdmFyaWFibGVzDQoNCmFub3ZhLm1lbHQuY29tYiA8LSByYmluZChhbm92YS5tZWx0LmJhYyxhbm92YS5tZWx0LnZpcixhbm92YS5tZWx0LnZpci5ob3N0KQ0KDQphbm92YS5tZWx0LmNvbWIkVmFyaWFibGUuY2xlYW4gPC0gZ3N1YigiXyIsIiAiLGFub3ZhLm1lbHQuY29tYiRWYXJpYWJsZSkNCg0KDQpmYW5jeS5hbm92YS5iYXIuY29tYi5ob3N0IDwtIGdnYmFycGxvdChhbm92YS5tZWx0LmNvbWIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg9IlZhcmlhYmxlLmNsZWFuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeT0idmFsdWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bGFiID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiQ29tbXVuaXR5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24gPSBjKCJob3Jpem9udGFsIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNmaWxsID0gIm1lYXN1cmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjg1KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBhbm92YS5tZWx0JFByRi5zeW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYi5zaXplID0gOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiLnZqdXN0ID0gMC44LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWIuaGp1c3QgPSAtMC4xDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKSArDQogIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1KSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMC4xLCAwLjIsIDAuNywgMC4xKSwgImluY2hlcyIpKSArDQogIHlsYWIoZXhwcmVzc2lvbihSXjJ+InZhbHVlIikpICsNCiAgc2NhbGVfZmlsbF9qY28oKQ0KDQpmYW5jeS5hbm92YS5iYXIuY29tYi5ob3N0DQoNCmBgYA0KDQojIyMgQmFjdGVyaWEgdnMgdmlyYSBvbmx5DQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD02fQ0KDQoNCmFub3ZhLm1lbHQuYmFjJENvbW11bml0eSA8LSAiQmFjdGVyaWEiDQphbm92YS5tZWx0LnZpciRDb21tdW5pdHkgPC0gIlZpcmEiDQoNCiMgUmVuYW1lIHZhcmlhYmxlcw0KDQphbm92YS5tZWx0LmNvbWIgPC0gcmJpbmQoYW5vdmEubWVsdC5iYWMsYW5vdmEubWVsdC52aXIpDQoNCmFub3ZhLm1lbHQuY29tYiRWYXJpYWJsZS5jbGVhbiA8LSBnc3ViKCJfIiwiICIsYW5vdmEubWVsdC5jb21iJFZhcmlhYmxlKQ0KDQoNCmZhbmN5LmFub3ZhLmJhci5jb21iIDwtIGdnYmFycGxvdChhbm92YS5tZWx0LmNvbWIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg9IlZhcmlhYmxlLmNsZWFuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeT0idmFsdWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWxhYiA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gIkNvbW11bml0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gYygiaG9yaXpvbnRhbCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZmlsbCA9ICJtZWFzdXJlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBhbm92YS5tZWx0JFByRi5zeW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYi5zaXplID0gNywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiLnZqdXN0ID0gMC44LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWIuaGp1c3QgPSAtMC4zDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKSArDQogIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1KSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMC4xLCAwLjIsIDAuNywgMC4xKSwgImluY2hlcyIpKSArDQogIHlsYWIoZXhwcmVzc2lvbihSXjJ+InZhbHVlIikpICsNCiAgc2NhbGVfZmlsbF9qY28oKQ0KDQpmYW5jeS5hbm92YS5iYXIuY29tYg0KDQpgYGANCg0KIyBSYWJ1cGxvdA0KDQojIyBUaW1lDQoNCmBgYHtyLCBtZXNzYWdlID0gRn0NCiNyZW1vdGVzOjppbnN0YWxsX2dpdGh1YigianN0b2tob2xtL3JhYnVwbG90IikNCmxpYnJhcnkocmFidXBsb3QpDQoNClBTVi5ob3N0QHNhbV9kYXRhJERheXMgPC0gZmFjdG9yKFBTVi5ob3N0QHNhbV9kYXRhJERheXMsIGxldmVscyA9IGMoIjkwIiwiNjAiLCIzMCIsIjE1IiwiMSIpKQ0KUFNCQHNhbV9kYXRhJERheXMgPC0gZmFjdG9yKFBTQkBzYW1fZGF0YSREYXlzLCBsZXZlbHMgPSBjKCI5MCIsIjYwIiwiMzAiLCIxNSIsIjEiKSkNCg0KcmFidS52aXIgPC0gcmFidXBsb3QoDQogIFBTVi5ob3N0LA0KICB2aW9saW4gPSBUUlVFLA0KICBwcmVkaWN0b3IgPSAiRGF5cyIsDQogIHBfYWRqdXN0ID0gVFJVRSwNCiAgTl90YXhhID0gMTAsDQogIGNvbG9ycyA9IGNvbF9maWxbMTo0XSwNCiAgaXRhbGljX25hbWVzID0gRkFMU0UpICsNCiAgZ2d0aXRsZSgiVmlyYWwgaG9zdHMiKQ0KDQpsYWJlbHMgPC0gbGV2ZWxzKGZhY3RvcihyYWJ1LnZpciRkYXRhJHZhcmlhYmxlKSkNCmxhYmVsc1tsYWJlbHMgIT0gIk90aGVyIGdlbnVzIl0gPC0gcGFzdGUwKCIqIiwgbGFiZWxzW2xhYmVscyAhPSAiT3RoZXIgZ2VudXMiXSwgIioiKQ0KDQpyYWJ1LnZpciA8LSByYWJ1LnZpciArIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gbGFiZWxzKSArIHRoZW1lKGF4aXMudGV4dC55ID0gZ2d0ZXh0OjplbGVtZW50X21hcmtkb3duKCkpDQoNCnJhYnUuYmFjIDwtIHJhYnVwbG90KA0KICBQU0IsDQogIHZpb2xpbiA9IFRSVUUsDQogIHByZWRpY3RvciA9ICJEYXlzIiwNCiAgcF9hZGp1c3QgPSBUUlVFLA0KICBOX3RheGEgPSAxMCwNCiAgY29sb3JzID0gY29sX2ZpbFsxOjRdLA0KICBpdGFsaWNfbmFtZXMgPSBGQUxTRSkgKw0KICAjdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIGdndGl0bGUoIkJhY3RlcmlhIikNCg0KbGFiZWxzIDwtIGxldmVscyhmYWN0b3IocmFidS5iYWMkZGF0YSR2YXJpYWJsZSkpDQpsYWJlbHNbbGFiZWxzICE9ICJPdGhlciBnZW51cyJdIDwtIHBhc3RlMCgiKiIsIGxhYmVsc1tsYWJlbHMgIT0gIk90aGVyIGdlbnVzIl0sICIqIikNCg0KcmFidS5iYWMgPC0gcmFidS5iYWMgKyBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGxhYmVscykgKyB0aGVtZShheGlzLnRleHQueSA9IGdndGV4dDo6ZWxlbWVudF9tYXJrZG93bigpKQ0KDQpnZ2FycmFuZ2UocmFidS5iYWMscmFidS52aXIsIGNvbW1vbi5sZWdlbmQgPSBUUlVFLCBsZWdlbmQgPSAiYm90dG9tIikNCmBgYA0KDQojIyBCcm9uY2hvcHVsbW9uYXJ5X2R5c3BsYXNpYQ0KDQpgYGB7ciwgbWVzc2FnZSA9IEZ9DQojcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoImpzdG9raG9sbS9yYWJ1cGxvdCIpDQpsaWJyYXJ5KHJhYnVwbG90KQ0KDQpyYWJ1LnZpci5icGQgPC0gcmFidXBsb3QoDQogIFBTVi5ob3N0LA0KICB2aW9saW4gPSBUUlVFLA0KICBwcmVkaWN0b3IgPSAiQnJvbmNob3B1bG1vbmFyeV9keXNwbGFzaWEiLA0KICBsZWdlbmRfdGl0bGUgPSAiQnJvbmNob3B1bG1vbmFyeSBkeXNwbGFzaWEiLA0KICBwX2FkanVzdCA9IFRSVUUsDQogICNwX3N0YXJzID0gVFJVRSwNCiAgTl90YXhhID0gMTAsDQogIGNvbG9ycyA9IGNvbF9maWxbMToyXSwNCiAgaXRhbGljX25hbWVzID0gRkFMU0UpICsNCiAgZ2d0aXRsZSgiVmlyYWwgaG9zdHMiKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gcmV2KQ0KDQpsYWJlbHMgPC0gbGV2ZWxzKGZhY3RvcihyYWJ1LnZpci5icGQkZGF0YSR2YXJpYWJsZSkpDQpsYWJlbHNbbGFiZWxzICE9ICJPdGhlciBnZW51cyJdIDwtIHBhc3RlMCgiKiIsIGxhYmVsc1tsYWJlbHMgIT0gIk90aGVyIGdlbnVzIl0sICIqIikNCg0KcmFidS52aXIuYnBkIDwtIHJhYnUudmlyLmJwZCArIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gbGFiZWxzKSArIHRoZW1lKGF4aXMudGV4dC55ID0gZ2d0ZXh0OjplbGVtZW50X21hcmtkb3duKCkpDQoNCg0KcmFidS5iYWMuYnBkIDwtIHJhYnVwbG90KA0KICBQU0IsDQogIHZpb2xpbiA9IFRSVUUsDQogIHByZWRpY3RvciA9ICJCcm9uY2hvcHVsbW9uYXJ5X2R5c3BsYXNpYSIsDQogIGxlZ2VuZF90aXRsZSA9ICJCcm9uY2hvcHVsbW9uYXJ5IGR5c3BsYXNpYSIsDQogIHBfYWRqdXN0ID0gVFJVRSwNCiAgI3Bfc3RhcnMgPSBUUlVFLA0KICBOX3RheGEgPSAxMCwNCiAgY29sb3JzID0gY29sX2ZpbFsxOjJdLA0KICBpdGFsaWNfbmFtZXMgPSBGQUxTRSkgKw0KICAjdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIGdndGl0bGUoIkJhY3RlcmlhIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IHJldikNCg0KbGFiZWxzIDwtIGxldmVscyhmYWN0b3IocmFidS5iYWMuYnBkJGRhdGEkdmFyaWFibGUpKQ0KbGFiZWxzW2xhYmVscyAhPSAiT3RoZXIgZ2VudXMiXSA8LSBwYXN0ZTAoIioiLCBsYWJlbHNbbGFiZWxzICE9ICJPdGhlciBnZW51cyJdLCAiKiIpDQoNCnJhYnUuYmFjLmJwZCA8LSByYWJ1LmJhYy5icGQgKyBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGxhYmVscykgKyB0aGVtZShheGlzLnRleHQueSA9IGdndGV4dDo6ZWxlbWVudF9tYXJrZG93bigpKQ0KICANCg0KZ2dhcnJhbmdlKHJhYnUuYmFjLmJwZCxyYWJ1LnZpci5icGQsIGNvbW1vbi5sZWdlbmQgPSBUUlVFLCBsZWdlbmQgPSAiYm90dG9tIikNCmBgYA0KDQojIyBJbnRyYXBhcnR1bSBhbnRpYmlvdGljcw0KDQpgYGB7ciwgbWVzc2FnZSA9IEZ9DQojcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoImpzdG9raG9sbS9yYWJ1cGxvdCIpDQpsaWJyYXJ5KHJhYnVwbG90KQ0KDQpyYWJ1LnZpci50ZGFiIDwtIHJhYnVwbG90KA0KICBQU1YuaG9zdCwNCiAgdmlvbGluID0gVFJVRSwNCiAgcHJlZGljdG9yID0gIkludHJhcGFydHVtX2FudGliaW90aWNfcHJvcGh5bGF4aXMiLA0KICBsZWdlbmRfdGl0bGUgPSAiSW50cmFwYXJ0dW0gYW50aWJpb3RpYyBwcm9waHlsYXhpcyIsDQogIHBfYWRqdXN0ID0gVFJVRSwNCiAgTl90YXhhID0gMTAsDQogIGNvbG9ycyA9IGNvbF9maWxbMTozXSwNCiAgaXRhbGljX25hbWVzID0gRkFMU0UpICsNCiAgI3RoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICBnZ3Bsb3QyOjpnZ3RpdGxlKCJWaXJhbCBob3N0cyIpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSByZXYpDQoNCmxhYmVscyA8LSBsZXZlbHMoZmFjdG9yKHJhYnUudmlyLnRkYWIkZGF0YSR2YXJpYWJsZSkpDQpsYWJlbHNbbGFiZWxzICE9ICJPdGhlciBnZW51cyJdIDwtIHBhc3RlMCgiKiIsIGxhYmVsc1tsYWJlbHMgIT0gIk90aGVyIGdlbnVzIl0sICIqIikNCg0KcmFidS52aXIudGRhYiA8LSByYWJ1LnZpci50ZGFiICsgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBsYWJlbHMpICsgdGhlbWUoYXhpcy50ZXh0LnkgPSBnZ3RleHQ6OmVsZW1lbnRfbWFya2Rvd24oKSkNCg0KcmFidS5iYWMudGRhYiA8LSByYWJ1cGxvdCgNCiAgUFNCLA0KICB2aW9saW4gPSBUUlVFLA0KICBwcmVkaWN0b3IgPSAiSW50cmFwYXJ0dW1fYW50aWJpb3RpY19wcm9waHlsYXhpcyIsDQogIGxlZ2VuZF90aXRsZSA9ICJJbnRyYXBhcnR1bSBhbnRpYmlvdGljIHByb3BoeWxheGlzIiwNCiAgcF9hZGp1c3QgPSBUUlVFLA0KICBOX3RheGEgPSAxMCwNCiAgY29sb3JzID0gY29sX2ZpbFsxOjNdLA0KICBpdGFsaWNfbmFtZXMgPSBGQUxTRSkgKw0KICAjdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIGdndGl0bGUoIkJhY3RlcmlhIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IHJldikNCg0KbGFiZWxzIDwtIGxldmVscyhmYWN0b3IocmFidS5iYWMudGRhYiRkYXRhJHZhcmlhYmxlKSkNCmxhYmVsc1tsYWJlbHMgIT0gIk90aGVyIGdlbnVzIl0gPC0gcGFzdGUwKCIqIiwgbGFiZWxzW2xhYmVscyAhPSAiT3RoZXIgZ2VudXMiXSwgIioiKQ0KDQpyYWJ1LmJhYy50ZGFiIDwtIHJhYnUuYmFjLnRkYWIgKyBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGxhYmVscykgKyB0aGVtZShheGlzLnRleHQueSA9IGdndGV4dDo6ZWxlbWVudF9tYXJrZG93bigpKQ0KDQpnZ2FycmFuZ2UocmFidS5iYWMudGRhYixyYWJ1LnZpci50ZGFiLCBjb21tb24ubGVnZW5kID0gVFJVRSwgbGVnZW5kID0gImJvdHRvbSIpDQpgYGANCg0KIyMgVG90YWwgZGF5cyBhbnRpYmlvdGljcyB0cmVhdG1lbnQNCg0KYGBge3IsIG1lc3NhZ2UgPSBGfQ0KI3JlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJqc3Rva2hvbG0vcmFidXBsb3QiKQ0KbGlicmFyeShyYWJ1cGxvdCkNCg0KcmFidS52aXIuaWFwIDwtIHJhYnVwbG90KA0KICBQU1YuaG9zdCwNCiAgdmlvbGluID0gVFJVRSwgcHJlZGljdG9yID0gIlRvdGFsX2RheXNfYW50aWJpb3RpY3NfdGhlcmFweSIsIHBfYWRqdXN0ID0gVFJVRSwgTl90YXhhID0gMTAsIGNvbG9ycyA9IGNvbF9maWxbMTozXSkgKw0KICBnZ3RpdGxlKCJWaXJhbCBob3N0cyIpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSByZXYpDQoNCnJhYnUuYmFjLmlhcCA8LSByYWJ1cGxvdCgNCiAgUFNCLA0KICB2aW9saW4gPSBUUlVFLCBwcmVkaWN0b3IgPSAiVG90YWxfZGF5c19hbnRpYmlvdGljc190aGVyYXB5IiwgcF9hZGp1c3QgPSBUUlVFLCBOX3RheGEgPSAxMCwgY29sb3JzID0gY29sX2ZpbFsxOjNdKSArDQogICN0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgZ2d0aXRsZSgiQmFjdGVyaWEiKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gcmV2KQ0KDQpnZ2FycmFuZ2UocmFidS5iYWMuaWFwLHJhYnUudmlyLmlhcCwgY29tbW9uLmxlZ2VuZCA9IFRSVUUsIGxlZ2VuZCA9ICJib3R0b20iKQ0KYGBgDQoNCiMjIEFudGliaW90aWNzIGF0IGJpcnRoDQoNCmBgYHtyLCBtZXNzYWdlID0gRn0NCiNyZW1vdGVzOjppbnN0YWxsX2dpdGh1YigianN0b2tob2xtL3JhYnVwbG90IikNCmxpYnJhcnkocmFidXBsb3QpDQoNCnJhYnUudmlyLnRkYWIgPC0gcmFidXBsb3QoDQogIFBTVi5ob3N0LA0KICB2aW9saW4gPSBUUlVFLCBwcmVkaWN0b3IgPSAiQW50aWJpb3RpY3NfYXRfYmlydGgiLCBwX2FkanVzdCA9IFRSVUUsIE5fdGF4YSA9IDEwLCBjb2xvcnMgPSBjb2xfZmlsWzE6M10pICsNCiAgZ2d0aXRsZSgiVmlyYWwgaG9zdHMiKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gcmV2KQ0KDQpyYWJ1LmJhYy50ZGFiIDwtIHJhYnVwbG90KA0KICBQU0IsDQogIHZpb2xpbiA9IFRSVUUsIHByZWRpY3RvciA9ICJBbnRpYmlvdGljc19hdF9iaXJ0aCIsIHBfYWRqdXN0ID0gVFJVRSwgTl90YXhhID0gMTAsIGNvbG9ycyA9IGNvbF9maWxbMTozXSkgKw0KICAjdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIGdndGl0bGUoIkJhY3RlcmlhIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IHJldikNCg0KZ2dhcnJhbmdlKHJhYnUuYmFjLnRkYWIscmFidS52aXIudGRhYiwgY29tbW9uLmxlZ2VuZCA9IFRSVUUsIGxlZ2VuZCA9ICJib3R0b20iKQ0KYGBgDQoNCiMjIFNtYWxsIGZvciBnZXN0YXRpb25hbCBhZ2UNCg0KYGBge3IsIG1lc3NhZ2UgPSBGfQ0KI3JlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJqc3Rva2hvbG0vcmFidXBsb3QiKQ0KbGlicmFyeShyYWJ1cGxvdCkNCg0KcmFidS52aXIuc2dhIDwtIHJhYnVwbG90KA0KICBQU1YuaG9zdCwNCiAgdmlvbGluID0gVFJVRSwNCiAgcHJlZGljdG9yID0gIlNtYWxsX2Zvcl9nZXN0YXRpb25hbF9hZ2UiLA0KICBsZWdlbmRfdGl0bGUgPSAiU21hbGwgZm9yIGdlc3RhdGlvbmFsIGFnZSIsDQogIHBfYWRqdXN0ID0gVFJVRSwNCiAgI3Bfc3RhcnMgPSBUUlVFLA0KICBOX3RheGEgPSAxMCwNCiAgY29sb3JzID0gY29sX2ZpbFszOjRdLA0KICBpdGFsaWNfbmFtZXMgPSBGQUxTRSkgKw0KICBnZ3RpdGxlKCJWaXJhbCBob3N0cyIpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSByZXYpDQoNCmxhYmVscyA8LSBsZXZlbHMoZmFjdG9yKHJhYnUudmlyLnNnYSRkYXRhJHZhcmlhYmxlKSkNCmxhYmVsc1tsYWJlbHMgIT0gIk90aGVyIGdlbnVzIl0gPC0gcGFzdGUwKCIqIiwgbGFiZWxzW2xhYmVscyAhPSAiT3RoZXIgZ2VudXMiXSwgIioiKQ0KDQpyYWJ1LnZpci5zZ2EgPC0gcmFidS52aXIuc2dhICsgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBsYWJlbHMpICsgdGhlbWUoYXhpcy50ZXh0LnkgPSBnZ3RleHQ6OmVsZW1lbnRfbWFya2Rvd24oKSkNCg0KcmFidS5iYWMuc2dhIDwtIHJhYnVwbG90KA0KICBQU0IsDQogIHZpb2xpbiA9IFRSVUUsDQogIHByZWRpY3RvciA9ICJTbWFsbF9mb3JfZ2VzdGF0aW9uYWxfYWdlIiwNCiAgbGVnZW5kX3RpdGxlID0gIlNtYWxsIGZvciBnZXN0YXRpb25hbCBhZ2UiLA0KICBwX2FkanVzdCA9IFRSVUUsDQogICNwX3N0YXJzID0gVFJVRSwNCiAgTl90YXhhID0gMTAsDQogIGNvbG9ycyA9IGNvbF9maWxbMzo0XSwNCiAgaXRhbGljX25hbWVzID0gRkFMU0UpICsNCiAgZ2d0aXRsZSgiQmFjdGVyaWEiKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gcmV2KQ0KDQpsYWJlbHMgPC0gbGV2ZWxzKGZhY3RvcihyYWJ1LmJhYy5zZ2EkZGF0YSR2YXJpYWJsZSkpDQpsYWJlbHNbbGFiZWxzICE9ICJPdGhlciBnZW51cyJdIDwtIHBhc3RlMCgiKiIsIGxhYmVsc1tsYWJlbHMgIT0gIk90aGVyIGdlbnVzIl0sICIqIikNCg0KcmFidS5iYWMuc2dhIDwtIHJhYnUuYmFjLnNnYSArIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gbGFiZWxzKSArIHRoZW1lKGF4aXMudGV4dC55ID0gZ2d0ZXh0OjplbGVtZW50X21hcmtkb3duKCkpDQoNCmdnYXJyYW5nZShyYWJ1LmJhYy5zZ2EscmFidS52aXIuc2dhLCBjb21tb24ubGVnZW5kID0gVFJVRSwgbGVnZW5kID0gImJvdHRvbSIpDQpgYGANCg0KIyBSQ0NBIC0gdHJhbnMga2luZ2RvbSBpbnRlcmFjdGlvbnMNCg0KIyMgQ29udmVyc2lvbiBhbmQgc2NyZWVwbG90DQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBULCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9DQojU3Vic2V0IHNhbXBsZXMgcHJlc2VudCBpbiBib3RoDQp2aXJfaWRzIDwtIFBTVkBzYW1fZGF0YSRkZXNjcmlwdGlvbiAlPiUgc3RyX3NwbGl0X2koIl8iLC0xKQ0KUFNWQHNhbV9kYXRhJGlkIDwtIHZpcl9pZHMNCg0KUFNCLkNTUy5ib3RoIDwtIHN1YnNldF9zYW1wbGVzKFBTQixkZXNjcmlwdGlvbiAlaW4lIHZpcl9pZHMpDQojUFNWLkNTUy5ib3RoIDwtIHN1YnNldF9zYW1wbGVzKFBTVi5DU1MsdmlyX2lkcyAlaW4lIFBTQi5DU1MuYm90aEBzYW1fZGF0YSRkZXNjcmlwdGlvbikNClBTVi5DU1MuaG9zdC5ib3RoIDwtIHN1YnNldF9zYW1wbGVzKFBTVi5DU1MuaG9zdCx2aXJfaWRzICVpbiUgUFNCLkNTUy5ib3RoQHNhbV9kYXRhJGRlc2NyaXB0aW9uKQ0KDQojI1RyYW5zcG9zZSBhbmQgY29udmVydCB0byBkYXRhZnJhbWVzDQpib3R1IDwtIGRhdGEuZnJhbWUoUFNCLkNTUy5ib3RoQG90dV90YWJsZSkNCiNTZWxlY3QgbGFzdCBub24tZW1wdHkgdGF4b25vbWljIHJhbmsNCnRheC5iYWMgPC0gYXMuZGF0YS5mcmFtZShQU0IuQ1NTLmJvdGhAdGF4X3RhYmxlKSAlPiUgZHBseXI6Om11dGF0ZV9hbGwofm5hX2lmKC4sICcnKSkgJT4lIGFwcGx5KC4sMSwgZnVuY3Rpb24oeCkgdGFpbChzdGF0czo6bmEub21pdCh4KSwgMSkpDQpyb3duYW1lcyhib3R1KSA8LSBwYXN0ZShyb3duYW1lcyhib3R1KSx0YXguYmFjLCBzZXAgPSAiLSIpDQoNCnZvdHUgPC0gZGF0YS5mcmFtZShQU1YuQ1NTLmhvc3QuYm90aEBvdHVfdGFibGUpDQojU2VsZWN0IGxhc3Qgbm9uLWVtcHR5IHRheG9ub21pYyByYW5rDQp0YXgudmlyIDwtIGFzLmRhdGEuZnJhbWUoUFNWLkNTUy5ob3N0LmJvdGhAdGF4X3RhYmxlKSAlPiUgZHBseXI6Om11dGF0ZV9hbGwofm5hX2lmKC4sICcnKSkgJT4lIGFwcGx5KC4sMSwgZnVuY3Rpb24oeCkgdGFpbChzdGF0czo6bmEub21pdCh4KSwgMSkpDQpyb3duYW1lcyh2b3R1KSA8LSBwYXN0ZShyb3duYW1lcyh2b3R1KSx0YXgudmlyLCBzZXAgPSAiLSIpDQoNCg0KICAjIyMjIyMjIyMjI0NvbnZlcnQgdG8gbWF0cml4IGFuZCB0cmFuc3Bvc2UgLSBNYXliZSBza2lwPw0KdChhcy5tYXRyaXguZGF0YS5mcmFtZShib3R1KSktPnRtYmFjdGVyaWENCiAgI1NhdmUgT1RVIFRheG9ub215IGZyb20gaGVhZGVyDQp0bWNvbG5hbWVzIDwtIGNvbG5hbWVzKHRtYmFjdGVyaWEpDQogICNSZW1vdmUgZmlyc3QgbGluZQ0Kcm93bmFtZXModG1iYWN0ZXJpYSkgPC0gTlVMTA0KICAjQXBwbHkgYXMubnVtZXJpYyB0byBtYXRyaXgod2lsbCByZW1vdmUgaGVhZGVyIGFzIGl0IGlzIGluIGNoYXJhY3RlcnMpDQpuYmFjdGVyaWEgPC0gbWFwcGx5KHRtYmFjdGVyaWEsIEZVTj1hcy5udW1lcmljKQ0KICAjQ29udmVydCBiYWNrIGludG8gbWF0cml4IGFuZCBhZGQgY29sbmFtZXMNCm1iYWN0ZXJpYSA8LSBtYXRyaXgobmJhY3RlcmlhLCBuY29sPU5DT0wodG1iYWN0ZXJpYSksIG5yb3c9TlJPVyh0bWJhY3RlcmlhKSkNCmNvbG5hbWVzKG1iYWN0ZXJpYSkgPC0gdG1jb2xuYW1lcw0KDQogIA0KICAgICMjUmVwZWF0IGZvciB2aXJhbCBPVFUgdGFibGUNCnQoYXMubWF0cml4LmRhdGEuZnJhbWUodm90dSkpLT50bXZpcm9tZQ0KdG1jb2xuYW1lcyA8LSBjb2xuYW1lcyh0bXZpcm9tZSkNCnJvd25hbWVzKHRtdmlyb21lKSA8LSBOVUxMDQpudmlyb21lIDwtIG1hcHBseSh0bXZpcm9tZSwgRlVOPWFzLm51bWVyaWMpDQptdmlyb21lIDwtIG1hdHJpeChudmlyb21lLCBuY29sPU5DT0wodG12aXJvbWUpLCBucm93PU5ST1codG12aXJvbWUpKQ0KY29sbmFtZXMobXZpcm9tZSkgPC0gdG1jb2xuYW1lcw0KICAgICMjQWx0ZXJuYXRpdmVseSB1c2U6IGRhdGEubWF0cml4KGZyYW1lLCByb3duYW1lcy5mb3JjZSA9IE5BKQ0KDQogICAgIyNDb252ZXJ0aW5nIGFuZCByZW1vdmluZyBuZWFyLXplcm8gdmFyaWFuY2UgdmFsdWVzDQpiYWMgPC0gbWJhY3RlcmlhWywtYygxKV0NCm56diA8LSBuZWFyWmVyb1ZhcihiYWMpDQpiYWMgPC0gYmFjWywgLW56diRQb3NpdGlvbl0NCiAgICAgICAgICAgDQogICAgICAgICAgIA0KdmlyIDwtIG12aXJvbWVbLC1jKDEpXQ0KI256diA8LSBuZWFyWmVyb1Zhcih2aXIpICMgSWYgYW55DQojdmlyIDwtIHZpclssIC1uenYkUG9zaXRpb25dDQoNCg0KICAjUENBDQpsaWJyYXJ5KHZlZ2FuKQ0KbW9kX2JhYyA8LSByZGEoYmFjLCBzY2FsZSA9IFRSVUUpDQpwbG90KG1vZF9iYWMsIHNjYWxpbmcgPSAzKQ0Kc2NyZWVwbG90KG1vZF9iYWMpDQptb2RfdmlyIDwtIHJkYSh2aXIsIHNjYWxlID0gVFJVRSkNCnBsb3QobW9kX3Zpciwgc2NhbGluZyA9IDMpDQpzY3JlZXBsb3QobW9kX3ZpcikNCg0Kc2NhbGluZyA9ICJzaHJpbmthZ2UiDQogICNBcHBseSBzY2FsaW5nIA0KcmVzdWx0XzFjb21wIDwtIHJjYyhiYWMsIHZpciwgbWV0aG9kID0gc2NhbGluZywgbmNvbXAgPSAxKQ0KcmVzdWx0XzJjb21wIDwtIHJjYyhiYWMsIHZpciwgbWV0aG9kID0gc2NhbGluZywgbmNvbXAgPSAyKQ0KcmVzdWx0XzNjb21wIDwtIHJjYyhiYWMsIHZpciwgbWV0aG9kID0gc2NhbGluZywgbmNvbXAgPSAzKQ0KcmVzdWx0XzRjb21wIDwtIHJjYyhiYWMsIHZpciwgbWV0aG9kID0gc2NhbGluZywgbmNvbXAgPSA0KQ0KDQpnZ2FycmFuZ2UocGxvdChyZXN1bHRfMWNvbXAsIHR5cGUgPSAiYmFycGxvdCIpLA0KICAgICAgICAgIHBsb3QocmVzdWx0XzJjb21wLCB0eXBlID0gImJhcnBsb3QiKSwNCiAgICAgICAgICBwbG90KHJlc3VsdF8zY29tcCwgdHlwZSA9ICJiYXJwbG90IiksDQogICAgICAgICAgcGxvdChyZXN1bHRfNGNvbXAsIHR5cGUgPSAiYmFycGxvdCIpDQogICAgICAgICAgLG5yb3cgPSAyKQ0KDQojIHByb2R1Y2UgYSBoZWF0IG1hcCBvZiB0aGUgY3Jvc3MgY29ycmVsYXRpb24gbWF0cml4DQppbWdDb3IoYmFjLCB2aXIsIHNpZGVDb2xvcnMgPSBjKCJwdXJwbGUiLCAiZ3JlZW4iKSkgDQpgYGANCg0KIyMgTW9kZWwgdHVuaW5nDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBULCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9DQojIHNldCBncmlkIHNlYXJjaCB2YWx1ZXMgZm9yIGVhY2ggcmVndWxhcmlzYXRpb24gcGFyYW1ldGVyDQpncmlkMSA8LSBzZXEoMC4wMDEsIDAuMiwgbGVuZ3RoID0gMjApIA0KZ3JpZDIgPC0gc2VxKDAuMDAxLCAwLjIsIGxlbmd0aCA9IDIwKQ0KDQojIG9wdGltaXNlIHRoZSByZWd1bGFyaXNhdGlvbiBwYXJhbWV0ZXIgdmFsdWVzDQpzbChjdi50dW5lLnJjYywgdHVuZS5yY2MoYmFjLCB2aXIsIGdyaWQxID0gZ3JpZDEsIGdyaWQyID0gZ3JpZDIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uID0gImxvbyIpLG92ZXJ3cml0ZSA9IEYpDQoNCiMgZXhhbWluZSB0aGUgcmVzdWx0cyBvZiBDViB0dW5pbmcNCnBsb3QoY3YudHVuZS5yY2MpDQpjdi50dW5lLnJjYw0KDQojbWFudWFsbHkgc2V0IGxhbWJkYSBzY29yZXMNCiNvcHQubDEgPC0gMS43DQojb3B0LmwyIDwtIDAuMDAzDQpvcHQubDEgPC0gY3YudHVuZS5yY2Mkb3B0LmxhbWJkYTENCm9wdC5sMiA8LSBjdi50dW5lLnJjYyRvcHQubGFtYmRhMg0KYGBgDQoNCiMjIE1vZGVsIGFuZCBjb21wb25lbnQgc2VsZWN0aW9uDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBULCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NCwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9DQpzaHJpbmsucmNjIDwtIHJjYyhiYWMsIHZpciwgbWV0aG9kID0gInNocmlua2FnZSIpDQoNCkNWLnJjYyA8LSByY2MoYmFjLCB2aXIsIG1ldGhvZCA9ICJyaWRnZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYTEgPSBvcHQubDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhMiA9IG9wdC5sMikgDQoNCiMgYmFycGxvdCBvZiBjcm9zcyB2YWxpZGF0aW9uIG1ldGhvZCByQ0NBIGNhbm9uaWNhbCBjb3JyZWxhdGlvbnMNCnBsb3QoQ1YucmNjLCB0eXBlID0gImJhcnBsb3QiLCBtYWluID0gIkNyb3NzIFZhbGlkYXRpb24iKSANCg0KIyBiYXJwbG90IG9mIHNocmlua2FnZSBtZXRob2QgckNDQSBjYW5vbmljYWwgY29ycmVsYXRpb25zDQpwbG90KHNocmluay5yY2MsIHR5cGUgPSAiYmFycGxvdCIsIG1haW4gPSAiU2hyaW5rYWdlIikNCmBgYA0KDQojIyBSdW4gbW9kZWwNCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IFQsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gIEYsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD00LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0NCiNQZXJmcm9tIG9wdGltaXNlZCBDViByQ0NBDQoNCnJlc3VsdC5DViA8LSByY2MoYmFjLCB2aXIsIG1ldGhvZCA9ICJyaWRnZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhMSA9IG9wdC5sMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEyID0gb3B0LmwyLA0KICAgICAgICAgICAgICBuY29tcD0zKQ0KDQpyZXN1bHQucmF3IDwtIHJjYyhiYWMsIHZpciwgbWV0aG9kID0gInNocmlua2FnZSIsbmNvbXA9MykNCg0KI1JlbW92ZSBPVFUgSURzIHRvIG9ubHkgc2hvdyB0YXhvbm9teQ0KcmVzdWx0IDwtIHJlc3VsdC5yYXcNCg0KcmVzdWx0JG5hbWVzJGNvbG5hbWVzJFggPC0gZ3N1YigiLipcXC0iLCAiIiwgcmVzdWx0JG5hbWVzJGNvbG5hbWVzJFgpICU+JSBtYWtlLnVuaXF1ZShzZXA9Il8iKQ0KcmVzdWx0JG5hbWVzJGNvbG5hbWVzJFkgPC0gZ3N1YigiLipcXC0iLCAiIiwgcmVzdWx0JG5hbWVzJGNvbG5hbWVzJFkpICU+JSBtYWtlLnVuaXF1ZShzZXA9Il8iKQ0KDQoNCiMgY29sbmFtZXMocmVzdWx0JFgpIDwtIGdzdWIoIi4qXFwtIiwgIiIsIGNvbG5hbWVzKHJlc3VsdCRYKSkNCiMgY29sbmFtZXMocmVzdWx0JFkpIDwtIGdzdWIoIi4qXFwtIiwgIiIsIGNvbG5hbWVzKHJlc3VsdCRZKSkNCg0KIyByb3duYW1lcyhyZXN1bHQkbG9hZGluZ3MkWCkgPC0gZ3N1YigiLipcXC0iLCAiIiwgcm93bmFtZXMocmVzdWx0JGxvYWRpbmdzJFgpKQ0KIyByb3duYW1lcyhyZXN1bHQkbG9hZGluZ3MkWSkgPC0gZ3N1YigiLipcXC0iLCAiIiwgcm93bmFtZXMocmVzdWx0JGxvYWRpbmdzJFkpKQ0KDQoNCmBgYA0KDQojIyBWaXN1YWxpemF0aW9uDQoNCiMjIyBIZWF0bWFwcyANCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IFQsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gIEYsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQ0KI0RlZm5lIHBhbGxldHRlIHRvIG9ubHkgYWRkIGNvbG91ciB0byBvbmx5IGhpZ2gNCiMjR2VuZXJhdGUgbmV3IHBhbGxldHRlDQpwYWxldHRlIDwtIGhjbC5jb2xvcnMoMjAwLCBwYWxldHRlID0gIlppc3NvdSAxIiwgYWxwaGEgPSBOVUxMLCByZXYgPSBGQUxTRSwgZml4dXAgPSBUUlVFKSAjU2VjbGVjdCBwYWxldHRlIGh0dHBzOi8vZGV2ZWxvcGVyLnItcHJvamVjdC5vcmcvQmxvZy9wdWJsaWMvMjAxOS8wNC8wMS9oY2wtYmFzZWQtY29sb3ItcGFsZXR0ZXMtaW4tZ3JkZXZpY2VzLw0KcGFsZXR0ZVs2MToxNDBdIDwtICJ3aGl0ZSIgI1NlbGVjdCB3aGljaCBwYXJ0IG9mIHBhbGxldHRlIHRvIHJlcGxhY2Ugd2l0aCB3aGl0ZQ0KDQojIGhpZ2g0XzJjIDwtIGNpbShyZXN1bHQsIGNvbXAgPSAxOjIsIHlsYWIgPSAiQmFjdGVyaWEiLCB4bGFiID0gIlZpcm9tZSIsIG1hcmdpbnMgPSBjKDEyLDE4KSxjdXRvZmYgPSAwLjQsIGNvbG9yID0gcGFsZXR0ZSkNCiMgaGlnaDQ1XzJjIDwtIGNpbShyZXN1bHQsIGNvbXAgPSAxOjIsIHlsYWIgPSAiQmFjdGVyaWEiLCB4bGFiID0gIlZpcm9tZSIsIG1hcmdpbnMgPSBjKDEyLDE4KSxjdXRvZmYgPSAwLjQ1LCBjb2xvciA9IHBhbGV0dGUpDQojaGlnaDVfM2MgPC0gY2ltKHJlc3VsdCwgY29tcCA9IDE6MiwgeWxhYiA9ICJCYWN0ZXJpYSIsIHhsYWIgPSAiVmlyb21lIiwgbWFyZ2lucyA9IGMoMTIsMTgpLGN1dG9mZiA9IDAuNSwgY29sb3IgPSBwYWxldHRlKQ0KDQojcGRmKGZpbGVuYW1lPSJoaWdoNV8zYy5wZGYiLCByZXMgPSA2MDAsIHdpZHRoID0gNDAwMCwgaGVpZ2h0ID0gNDAwMCkNCiNoaWdoNV8zYw0KI2Rldi5vZmYoKQ0KDQojIyMjIyMNCg0KaGlnaDZfM2MgPC0gY2ltKHJlc3VsdCwgY29tcCA9IDE6MywgeWxhYiA9ICJCYWN0ZXJpYSIsIHhsYWIgPSAiVmlyb21lIGhvc3QgcHJlZGljdGlvbiIsIG1hcmdpbnMgPSBjKDcsOSksY3V0b2ZmID0gMC42LCBjb2xvciA9IHBhbGV0dGUpDQpoaWdoNV8zYyA8LSBjaW0ocmVzdWx0LCBjb21wID0gMTozLCB5bGFiID0gIkJhY3RlcmlhIiwgeGxhYiA9ICJWaXJvbWUgaG9zdCBwcmVkaWN0aW9uIiwgbWFyZ2lucyA9IGMoNyw5KSxjdXRvZmYgPSAwLjUsIGNvbG9yID0gcGFsZXR0ZSkNCmhpZ2g0NV8zYzwtIGNpbShyZXN1bHQsIGNvbXAgPSAxOjMsIHlsYWIgPSAiQmFjdGVyaWEiLCB4bGFiID0gIlZpcm9tZSBob3N0IHByZWRpY3Rpb24iLCBtYXJnaW5zID0gYygxNSwyMCksY3V0b2ZmID0gMC40NSwgY29sb3IgPSBwYWxldHRlKQ0KaGlnaDRfM2MgPC0gY2ltKHJlc3VsdCwgY29tcCA9IDE6MywgeWxhYiA9ICJCYWN0ZXJpYSIsIHhsYWIgPSAiVmlyb21lIGhvc3QgcHJlZGljdGlvbiIsIG1hcmdpbnMgPSBjKDE1LDIwKSxjdXRvZmYgPSAwLjQsIGNvbG9yID0gcGFsZXR0ZSkNCg0KI21hdDUgPC0gaGlnaDVfMmMkbWF0DQptYXQ2XzNjIDwtIGhpZ2g2XzNjJG1hdA0KbWF0NDVfM2MgPC0gaGlnaDQ1XzNjJG1hdA0KbWF0NF8zYyA8LSBoaWdoNF8zYyRtYXQNCiAgDQogI091dHB1dCBNYXRyaXgNCndyaXRlLnRhYmxlKG1hdDQ1XzNjLCAiTWF0cml4X2hpZ2hfMy1Db21wb25lbnRfMC40NS50eHQiLCBzZXA9Ilx0IikNCg0KI01ha2UgbGluZWFyIHBsb3RzIG9mIGFsbCBiYWMgYW5kIHZpciANCmJhY21hdDZfM2MgPC0gYmFjWyxyb3duYW1lcyhtYXQ2XzNjKV0NCnZpcm1hdDZfM2MgPC0gdmlyWyxjb2xuYW1lcyhtYXQ2XzNjKV0NCmJhY3Zpcm1hdDZfM2MgPC0gY2JpbmQoYmFjbWF0Nl8zYyx2aXJtYXQ2XzNjKQ0KYmFjNDVfM2MgPC0gYmFjWyxyb3duYW1lcyhtYXQ0NV8zYyldDQp2aXI0NV8zYyA8LSB2aXJbLGNvbG5hbWVzKG1hdDQ1XzNjKV0NCmJhY3Zpcm1hdDQ1XzNjIDwtIGNiaW5kKGJhYzQ1XzNjLHZpcjQ1XzNjKQ0KDQojZ2dwYWlycw0KbGlicmFyeShHR2FsbHkpDQojZ2dwYWlycyhiYWN2aXIpDQojZ2dwYWlycyhiYWN2aXI0NSxjb2x1bW5zPTM6MTMpDQojZ2dwYWlycyhhcy5kYXRhLmZyYW1lKGJhY3ZpcjQ1KSkNCnNsKHBhaXJzNDUsZ2dwYWlycyhhcy5kYXRhLmZyYW1lKGJhY3Zpcm1hdDQ1XzNjKSkpDQpzbChwYWlyczYsZ2dwYWlycyhhcy5kYXRhLmZyYW1lKGJhY3Zpcm1hdDZfM2MpKSkNCg0KIyBwYWlyczQ1ICsNCiMgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IC05MCwgaGp1c3QgPSAwLCB2anVzdD0wLjUpKSANCg0KI3BhaXJzNiArDQojICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAtOTAsIGhqdXN0ID0gMCwgdmp1c3Q9MC41KSkgDQpgYGANCg0KIyMjIE5ldHdvcmsgcGxvdHMNCg0KIyMjIyBTaHJpbmthZ2UNCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IFQsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gIEYsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD02LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0NCiMgUmVmb3JtYXQgZm9yIGdlcGhpDQoNCiMjIFNhdmUgYmxvY2tzIGFzIHBvbHlnb24gdG8gZGV0ZXJtaW5lIHNoYXBlIGluIG5ldHdvcmsNCg0KcmVzdWx0JG5hbWVzJFBvbHlnb24gPC0gcmVzdWx0JG5hbWVzJGRhdGENCnJlc3VsdCRuYW1lcyRQb2x5Z29uIDwtIHJlcGxhY2UocmVzdWx0JG5hbWVzJGRhdGEsIGMoImJhYyIsInZpciIpLGMoMyw0KSkgJT4lIGFzLmludGVnZXIoKQ0KDQojIyBSZW1vdmUgdWJpcXVlIG1hcmtlcnMgdG8gYWxsb3cgc2hhcmVkIGNvbG9yaW5nIGluIEdlcGhpDQpyZXN1bHQkbmFtZXNfc2ltcGxlJGNvbG5hbWVzJFggPC0gZ3N1YigiKi5cXF8iLCAiIiwgcmVzdWx0JG5hbWVzJGNvbG5hbWVzJFgpDQpyZXN1bHQkbmFtZXNfc2ltcGxlJGNvbG5hbWVzJFkgPC0gZ3N1YigiKi5cXF8iLCAiIiwgcmVzdWx0JG5hbWVzJGNvbG5hbWVzJFkpDQoNCiNTaG93IG5ldHdvcmsNCg0KbmV0d29yayhyZXN1bHQsIGNvbXAgPSAxOjMsIGludGVyYWN0aXZlID0gRkFMU0UsDQogICAgICAgIGx3ZC5lZGdlID0gMiwNCiAgICAgICAgY2V4Lm5vZGUubmFtZSA9IDE0LA0KICAgICAgICBjdXRvZmYgPSAwLjMsDQogICAgICAgIGNvbG9yLm5vZGUgPSBjb2xfZmlsWzE6Ml0pIA0KDQpuZXR3b3JrKHJlc3VsdCwgY29tcCA9IDE6MywgaW50ZXJhY3RpdmUgPSBGQUxTRSwNCiAgICAgICAgbHdkLmVkZ2UgPSAyLA0KICAgICAgICBjdXRvZmYgPSAwLjQsDQogICAgICAgIGNvbG9yLm5vZGUgPSBjb2xfZmlsWzE6Ml0pIA0KDQpuZXR3b3JrKHJlc3VsdCwgY29tcCA9IDE6MywgaW50ZXJhY3RpdmUgPSBGQUxTRSwNCiAgICAgICAgbHdkLmVkZ2UgPSAyLA0KICAgICAgICBjdXRvZmYgPSAwLjUsDQogICAgICAgIGNvbG9yLm5vZGUgPSBjb2xfZmlsWzE6Ml0pIA0KDQojRXhwb3J0IG5ldHdvcmsgcmVzdWx0DQpuZXR3b3JrLnJlcyA8LSBuZXR3b3JrKHJlc3VsdCwgY29tcCA9IDE6MywgaW50ZXJhY3RpdmUgPSBGQUxTRSwNCiAgICAgICAgbHdkLmVkZ2UgPSAyLA0KICAgICAgICBjdXRvZmYgPSAwLjMwLA0KICAgICAgICBjb2xvci5ub2RlID0gY29sX2ZpbFsxOjJdKQ0KDQpsaWJyYXJ5KGlncmFwaCkNCg0KI25ldHdvcmsucmVzIA0KDQp3cml0ZS5ncmFwaChuZXR3b3JrLnJlcyRnUiwgZmlsZSA9ICJuZXR3b3JrLnNocmlua2FnZTAuMy5nbWwiLCBmb3JtYXQgPSAiZ21sIikNCmBgYA0KDQojIyMjIENWDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBULCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NiwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9DQpyZXN1bHQuQ1YkbmFtZXNfc2ltcGxlJGNvbG5hbWVzJFggPC0gZ3N1YigiKi5cXF8iLCAiIiwgcmVzdWx0LkNWJG5hbWVzJGNvbG5hbWVzJFgpDQpyZXN1bHQuQ1YkbmFtZXNfc2ltcGxlJGNvbG5hbWVzJFkgPC0gZ3N1YigiKi5cXF8iLCAiIiwgcmVzdWx0LkNWJG5hbWVzJGNvbG5hbWVzJFkpDQoNCiNTaG93IG5ldHdvcmsNCm5ldHdvcmsocmVzdWx0LkNWLCBjb21wID0gMTozLCBpbnRlcmFjdGl2ZSA9IEZBTFNFLA0KICAgICAgICBsd2QuZWRnZSA9IDIsDQogICAgICAgIGN1dG9mZiA9IDAuMywNCiAgICAgICAgY29sb3Iubm9kZSA9IGNvbF9maWxbMToyXSkgDQoNCm5ldHdvcmsocmVzdWx0LkNWLCBjb21wID0gMTozLCBpbnRlcmFjdGl2ZSA9IEZBTFNFLA0KICAgICAgICBsd2QuZWRnZSA9IDIsDQogICAgICAgIGN1dG9mZiA9IDAuMzUsDQogICAgICAgIGNvbG9yLm5vZGUgPSBjb2xfZmlsWzE6Ml0pIA0KDQojIG5ldHdvcmsocmVzdWx0LkNWLCBjb21wID0gMTozLCBpbnRlcmFjdGl2ZSA9IEZBTFNFLA0KIyAgICAgICAgIGx3ZC5lZGdlID0gMiwNCiMgICAgICAgICBjdXRvZmYgPSAwLjUsDQojICAgICAgICAgY29sb3Iubm9kZSA9IGNvbF9maWxbMToyXSkgDQoNCg0KbGlicmFyeShpZ3JhcGgpDQpuZXR3b3JrLnJlcyA8LSBuZXR3b3JrKHJlc3VsdCwgY29tcCA9IDE6MywgaW50ZXJhY3RpdmUgPSBGQUxTRSwNCiAgICAgICAgbHdkLmVkZ2UgPSAyLA0KICAgICAgICBjdXRvZmYgPSAwLjMwLA0KICAgICAgICBjb2xvci5ub2RlID0gY29sX2ZpbFsxOjJdKQ0KDQp3cml0ZS5ncmFwaChuZXR3b3JrLnJlcyRnUiwgZmlsZSA9ICJuZXR3b3JrLkNWMC4zLmdtbCIsIGZvcm1hdCA9ICJnbWwiKQ0KYGBgDQoNCiMgRmlndXJlcyAtIGFycmFuZ2UgYW5kIHNhdmUNCg0KIyMgRmlndXJlIDENCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gIEYsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD02LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0NCg0KcGxvdF9ncmlkKGFtcF92aXJfZ2VudXMsDQogICAgICAgICAgcGxvdF9ncmlkKGJhcl9iYWMsYmFyX2hvc3QsDQogICAgICAgICAgbnJvdyA9IDEsDQogICAgICAgICAgbGFiZWxzID0gYygiQiIsIkMiKSwNCiAgICAgICAgICBsYWJlbF9zaXplID0gMzAsIGhqdXN0ID0gMC4zLHZqdXN0ID0gMSwNCiAgICAgICAgICByZWxfaGVpZ2h0cyA9IGMoMSwxKSwNCiAgICAgICAgICByZWxfd2lkdGhzID0gYygxLjE1LDEpDQogICAgICAgICAgKSwNCiAgICAgICAgICBucm93ID0gMiwNCiAgICAgICAgICBsYWJlbHMgPSBjKCJBIiwiIiksDQogICAgICAgICAgbGFiZWxfc2l6ZSA9IDMwLCBoanVzdCA9IDAuMyx2anVzdCA9IDEsDQogICAgICAgICAgcmVsX2hlaWdodHMgPSBjKDEsMS41KQ0KKSArDQogIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDAsMCwwLDAuNSksICJjbSIpKSANCg0KZ2dzYXZlKCJGaWd1cmVzL0ZpZ3VyZSAxLnBuZyIsd2lkdGggPSAyNSwgaGVpZ2h0ID0gMTYsIHVuaXRzID0gImNtIiwgZHBpID0gNDAwKSANCg0KZ2dzYXZlKCJGaWd1cmVzL0ZpZ3VyZSAxLnRpZmYiLHdpZHRoID0gMjUsIGhlaWdodCA9IDE2LCB1bml0cyA9ICJjbSIsIGRwaSA9IDQwMCwgY29tcHJlc3Npb24gPSAibHp3IikgDQoNCmdnc2F2ZSgiRmlndXJlcy9GaWd1cmUgMS5wZGYiLHdpZHRoID0gMjUsIGhlaWdodCA9IDE2LCB1bml0cyA9ICJjbSIsIGRwaSA9IDQwMCkgDQpgYGANCg0KIyMgRmlndXJlIFMxDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MTUsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQ0KDQpwbG90X2dyaWQocGxvdF9ncmlkKGJhcl9iYWNfZmFtLGJhcl92aXJfZmFtaWx5LA0KICAgICAgICAgICAgICAgICAgICBucm93ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQSIsIkIiKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxfc2l6ZSA9IDMwLCBoanVzdCA9IDAuMyx2anVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgIHJlbF9oZWlnaHRzID0gYygxLDEpLA0KICAgICAgICAgICAgICAgICAgICByZWxfd2lkdGhzID0gYygxLjE1LDEpDQogICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgcGxvdF9ncmlkKGFtcF9iYWNfZ2VudXMscGxvdF9ncmlkKHVwc2V0LmJhYy50aW1lJE1haW5fYmFyLHVwc2V0LmJhYy50aW1lJE1hdHJpeCxucm93PTIscmVsX2hlaWdodHMgPSBjKDMsMSksIHNjYWxlID0gMC44NSksDQogICAgICAgICAgICAgICAgICAgIG5yb3cgPSAxLGxhYmVscyA9IGMoIkMiLCJEIiksDQogICAgICAgICAgICAgICAgICAgIGxhYmVsX3NpemUgPSAzMCwgaGp1c3QgPSAwLjMsdmp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICByZWxfaGVpZ2h0cyA9IGMoMSwxKSwNCiAgICAgICAgICAgICAgICAgICAgcmVsX3dpZHRocyA9IGMoMywxKQ0KICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgIHBsb3RfZ3JpZChhbXBfdmlyX3NwZWNpZXMsIHBsb3RfZ3JpZCh1cHNldC52aXIudGltZSRNYWluX2Jhcix1cHNldC52aXIudGltZSRNYXRyaXgsbnJvdz0yLHJlbF9oZWlnaHRzID0gYygzLDEpLCBzY2FsZSA9IDAuODUpLA0KICAgICAgICAgICAgICAgICAgICBucm93ID0gMSxsYWJlbHMgPSBjKCJFIiwiRiIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbF9zaXplID0gMzAsIGhqdXN0ID0gMC4zLHZqdXN0ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgcmVsX2hlaWdodHMgPSBjKDEsMSksDQogICAgICAgICAgICAgICAgICAgIHJlbF93aWR0aHMgPSBjKDMsMSkNCiAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICBucm93ID0gNCwNCiAgICAgICAgICBsYWJlbHMgPSBjKCIiLCIiLCIiKSwNCiAgICAgICAgICBsYWJlbF9zaXplID0gMzAsIGhqdXN0ID0gMC4zLHZqdXN0ID0gMSwNCiAgICAgICAgICByZWxfaGVpZ2h0cyA9IGMoMC43LDEsMSkNCikgKw0KICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygwLDAsMCwwLjUpLCAiY20iKSkgDQoNCmdnc2F2ZSgiRmlndXJlcy9GaWd1cmUgUzEucG5nIix3aWR0aCA9IDI1LCBoZWlnaHQgPSA0MCwgdW5pdHMgPSAiY20iLCBkcGkgPSA0MDApIA0KDQpnZ3NhdmUoIkZpZ3VyZXMvRmlndXJlIFMxLnRpZmYiLHdpZHRoID0gMjUsIGhlaWdodCA9IDQwLCB1bml0cyA9ICJjbSIsIGRwaSA9IDQwMCwgY29tcHJlc3Npb24gPSAibHp3IikNCg0KZ2dzYXZlKCJGaWd1cmVzL0ZpZ3VyZSBTMS5wZGYiLHdpZHRoID0gMjUsIGhlaWdodCA9IDQwLCB1bml0cyA9ICJjbSIsIGRwaSA9IDQwMCkgDQpgYGANCg0KIyMgRmlndXJlIDINCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gIEYsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0xMiwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9DQoNCnBsb3RfZ3JpZChwbG90X2dyaWQoYmFjLmFscGhhLHZpci5hbHBoYSwNCiAgICAgICAgICBucm93ID0gMSwNCiAgICAgICAgICBsYWJlbHMgPSBjKCJBIiwiQiIpLA0KICAgICAgICAgIGxhYmVsX3NpemUgPSAzMCwgaGp1c3QgPSAwLjMsdmp1c3QgPSAxLA0KICAgICAgICAgIHJlbF9oZWlnaHRzID0gYygxLDEpLA0KICAgICAgICAgIHJlbF93aWR0aHMgPSBjKDEsMSkNCiAgICAgICAgICApLA0KICAgICAgICAgIHBsb3RfZ3JpZChiYWMuYmV0YSx2aXIuYmV0YSwNCiAgICAgICAgICBucm93ID0gMSwNCiAgICAgICAgICBsYWJlbHMgPSBjKCJDIiwiRCIpLA0KICAgICAgICAgIGxhYmVsX3NpemUgPSAzMCwgaGp1c3QgPSAwLjMsdmp1c3QgPSAxLA0KICAgICAgICAgIHJlbF9oZWlnaHRzID0gYygxLDEpLA0KICAgICAgICAgIHJlbF93aWR0aHMgPSBjKDEsMSkNCiAgICAgICAgICApLA0KICAgICAgICAgIHBsb3RfZ3JpZChCcmF5UGxvdC5iYWMuMCwgQnJheVBsb3QuYmFjLjE1LCBCcmF5UGxvdC5iYWMuMzAsIEJyYXlQbG90LmJhYy45MCwNCiAgICAgICAgICBucm93ID0gMSwNCiAgICAgICAgICAjbGFiZWxzID0gYygiIiwiIiksDQogICAgICAgICAgbGFiZWxfc2l6ZSA9IDMwLCBoanVzdCA9IDAuMyx2anVzdCA9IDEsDQogICAgICAgICAgcmVsX2hlaWdodHMgPSBjKDEsMSksDQogICAgICAgICAgcmVsX3dpZHRocyA9IGMoMS4xNSwxKQ0KICAgICAgICAgICkrdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMC41LDAsMCwwKSwgImNtIikpLA0KICAgICAgICAgIHBsb3RfZ3JpZChCcmF5UGxvdC52aXIuMCwgQnJheVBsb3QudmlyLjE1LCBCcmF5UGxvdC52aXIuMzAsIEJyYXlQbG90LnZpci45MCwNCiAgICAgICAgICBucm93ID0gMSwNCiAgICAgICAgICAjbGFiZWxzID0gYygiQyIsIkQiKSwNCiAgICAgICAgICBsYWJlbF9zaXplID0gMzAsIGhqdXN0ID0gMC4zLHZqdXN0ID0gMSwNCiAgICAgICAgICByZWxfaGVpZ2h0cyA9IGMoMSwxKSwNCiAgICAgICAgICByZWxfd2lkdGhzID0gYygxLjE1LDEpDQogICAgICAgICAgKSt0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygwLjUsMCwwLDApLCAiY20iKSksDQogICAgICAgICAgbnJvdyA9IDQsDQogICAgICAgICAgbGFiZWxzID0gYygiIiwiIiwiRSIsIkYiKSwNCiAgICAgICAgICBsYWJlbF9zaXplID0gMzAsIGhqdXN0ID0gMC4zLHZqdXN0ID0gMSwNCiAgICAgICAgICByZWxfaGVpZ2h0cyA9IGMoMSwxLDAuOCwwLjgpDQogICAgICAgICAgKSArDQogIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDAsMCwwLDAuNSksICJjbSIpKQ0KICAgICAgICAgIA0KDQpnZ3NhdmUoIkZpZ3VyZXMvRmlndXJlIDIucG5nIix3aWR0aCA9IDI1LCBoZWlnaHQgPSAzMCwgdW5pdHMgPSAiY20iLCBkcGkgPSA0MDApIA0KDQpnZ3NhdmUoIkZpZ3VyZXMvRmlndXJlIDIudGlmZiIsd2lkdGggPSAyNSwgaGVpZ2h0ID0gMzAsIHVuaXRzID0gImNtIiwgZHBpID0gNDAwLCBjb21wcmVzc2lvbiA9ICJsenciKQ0KDQpnZ3NhdmUoIkZpZ3VyZXMvRmlndXJlIDIucGRmIix3aWR0aCA9IDI1LCBoZWlnaHQgPSAzMCwgdW5pdHMgPSAiY20iLCBkcGkgPSA0MDApIA0KYGBgDQoNCiMjIEZpZ3VyZSBTMg0KDQpgYGB7ciwgZXZhbCA9IFQsIGluY2x1ZGUgPSBULCBlY2hvID0gRiwgbWVzc2FnZSA9IEYsIHdhcm5pbmcgPSAgRiwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQ0KDQpnZ2FycmFuZ2UocmFidS5iYWMscmFidS52aXIsIGNvbW1vbi5sZWdlbmQgPSBUUlVFLCBsZWdlbmQgPSAiYm90dG9tIixsYWJlbHM9YygiQSIsIkIiKSxmb250LmxhYmVsID0gbGlzdChzaXplID0gMzApLCBsYWJlbC54ID0gMCwgbGFiZWwueSA9IDEpDQoNCmdnc2F2ZSgiRmlndXJlcy9GaWd1cmUgUzIucG5nIix3aWR0aCA9IDI1LCBoZWlnaHQgPSAxNSwgdW5pdHMgPSAiY20iLCBkcGkgPSA0MDApIA0KDQpnZ3NhdmUoIkZpZ3VyZXMvRmlndXJlIFMyLnRpZmYiLHdpZHRoID0gMjUsIGhlaWdodCA9IDE1LCB1bml0cyA9ICJjbSIsIGRwaSA9IDQwMCwgY29tcHJlc3Npb24gPSAibHp3IikNCg0KZ2dzYXZlKCJGaWd1cmVzL0ZpZ3VyZSBTMi5wZGYiLHdpZHRoID0gMjUsIGhlaWdodCA9IDE1LCB1bml0cyA9ICJjbSIsIGRwaSA9IDQwMCkgDQpgYGANCg0KIyMgRmlndXJlIFMzDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9DQoNCmdnYXJyYW5nZShhbHBoYS5tZXRyaWNzLmJhYyxhbHBoYS5tZXRyaWNzLnZpciwgY29tbW9uLmxlZ2VuZCA9IFRSVUUsIGxlZ2VuZCA9ICJib3R0b20iLGxhYmVscz1jKCJBIiwiQiIpLGZvbnQubGFiZWwgPSBsaXN0KHNpemUgPSAzMCksIGxhYmVsLnggPSAwLCBsYWJlbC55ID0gMSkNCg0KDQpnZ3NhdmUoIkZpZ3VyZXMvRmlndXJlIFMzLnBuZyIsd2lkdGggPSAyNSwgaGVpZ2h0ID0gMTAsIHVuaXRzID0gImNtIiwgZHBpID0gNDAwKSANCg0KZ2dzYXZlKCJGaWd1cmVzL0ZpZ3VyZSBTMy50aWZmIix3aWR0aCA9IDI1LCBoZWlnaHQgPSAxMCwgdW5pdHMgPSAiY20iLCBkcGkgPSA0MDAsIGNvbXByZXNzaW9uID0gImx6dyIpIA0KDQpnZ3NhdmUoIkZpZ3VyZXMvRmlndXJlIFMzLnBkZiIsd2lkdGggPSAyNSwgaGVpZ2h0ID0gMTAsIHVuaXRzID0gImNtIiwgZHBpID0gNDAwKQ0KYGBgDQoNCiMjIEZpZ3VyZSAzDQoNCmBgYHtyLCBldmFsID0gVCwgaW5jbHVkZSA9IFQsIGVjaG8gPSBGLCBtZXNzYWdlID0gRiwgd2FybmluZyA9ICBGLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NiwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9DQpmYW5jeS5hbm92YS5iYXIuY29tYi5ob3N0DQojZ2dhcnJhbmdlKGZhbmN5LmFub3ZhLmJhci5jb21iLmhvc3QsbGFiZWxzPWMoIkEiLGZvbnQubGFiZWwgPSBsaXN0KHNpemUgPSAzMCksIGxhYmVsLnggPSAwLCBsYWJlbC55ID0gMSx3aWR0aHMgPSBjKDEsMC43NSkpDQoNCmdnc2F2ZSgiRmlndXJlcy9GaWd1cmUgMy5wbmciLHdpZHRoID0gMjUsIGhlaWdodCA9IDE4LCB1bml0cyA9ICJjbSIsIGRwaSA9IDQwMCkgDQoNCmdnc2F2ZSgiRmlndXJlcy9GaWd1cmUgMy50aWZmIix3aWR0aCA9IDI1LCBoZWlnaHQgPSAxOCwgdW5pdHMgPSAiY20iLCBkcGkgPSA0MDAsIGNvbXByZXNzaW9uID0gImx6dyIpDQoNCmdnc2F2ZSgiRmlndXJlcy9GaWd1cmUgMy5wZGYiLHdpZHRoID0gMjUsIGhlaWdodCA9IDE4LCB1bml0cyA9ICJjbSIsIGRwaSA9IDQwMCkNCmBgYA0KDQojIyBGaWd1cmUgUzQNCg0KYGBge3IsIGV2YWwgPSBULCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gIEYsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD02LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0NCmdnYXJyYW5nZShnZ2FycmFuZ2UocmFidS5iYWMuYnBkLHJhYnUudmlyLmJwZCwgY29tbW9uLmxlZ2VuZCA9IFRSVUUsIGxlZ2VuZCA9ICJib3R0b20iLGxhYmVscz1jKCJBIiwiQiIpLGZvbnQubGFiZWwgPSBsaXN0KHNpemUgPSAzMCksIGxhYmVsLnggPSAwLCBsYWJlbC55ID0gMS4wNyksDQogICAgICAgICAgZ2dhcnJhbmdlKHJhYnUuYmFjLnNnYSxyYWJ1LnZpci5zZ2EsIGNvbW1vbi5sZWdlbmQgPSBUUlVFLCBsZWdlbmQgPSAiYm90dG9tIixsYWJlbHM9YygiQyIsIkQiKSxmb250LmxhYmVsID0gbGlzdChzaXplID0gMzApLCBsYWJlbC54ID0gMCwgbGFiZWwueSA9IDEuMDcpLA0KICAgICAgICAgIG5yb3cgPSAyDQogICAgICAgICAgKSArDQogIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDAuMiwwLDAsMC41KSwgImNtIikpDQoNCmdnc2F2ZSgiRmlndXJlcy9GaWd1cmUgUzQucG5nIix3aWR0aCA9IDI1LCBoZWlnaHQgPSAxNywgdW5pdHMgPSAiY20iLCBkcGkgPSA0MDApIA0KDQpnZ3NhdmUoIkZpZ3VyZXMvRmlndXJlIFM0LnRpZmYiLHdpZHRoID0gMjUsIGhlaWdodCA9IDE3LCB1bml0cyA9ICJjbSIsIGRwaSA9IDQwMCwgY29tcHJlc3Npb24gPSAibHp3IikgDQoNCmdnc2F2ZSgiRmlndXJlcy9GaWd1cmUgUzQucGRmIix3aWR0aCA9IDI1LCBoZWlnaHQgPSAxNywgdW5pdHMgPSAiY20iLCBkcGkgPSA0MDApDQpgYGANCg0KDQoNCiMgU2Vzc2lvbiBpbmZvDQoNCmBgYHtyfQ0Kc2Vzc2lvbkluZm8oKQ0KYGBg